php八大设计模式之桥接模式
2024-10-01 17:03:36
一个抽象产生多种具体的实现方式,单纯的通过子类继承会有子类爆炸(过多的子类产生)的现象,系统需要它们之间进行动态耦合。
面向过程:
<?php
header("content-type:text/html;charset=utf8");
/**
* 在一个网站中,我们都有给用户发通知消息的情况。比如有站内发送、 邮箱发送、及短信发送等等。
* 面向过程形式完成发送。
*/
//发送信息接口。
interface info{
public function send($to,$msg);
}
//站内方式发送。
class zn implements info{
public function send($to,$con){
echo "站内给:".$to." 内容是:".$con;
}
}
//邮箱方式发送。
class email implements info{
public function send($to,$con){
echo "email给:".$to." 内容是:".$con;
}
}
//短信方式发送。
class sms implements info{
public function send($to,$con){
echo "短信给:".$to." 内容是:".$con;
}
}
/**
* 可是如下还有分发送的级别呢?是不是又要继承出多个子类?
* 站内方式发送【普通】。
* class znInfo implements info{}
* 邮箱方式发送【普通】。
* class emailInfo implements info{}
* 短信方式发送【普通】。
* class smsInfo implements info{}
* ......
* .........
*
*/
?>
桥接模式:
<?php
header("content-type:text/html;charset=utf8");
/**
* 桥接模式完成发送。
* 虽然代码有些耦合,但是解决了子类爆炸(过多的现象)。
*/
//抽象的发送类。
abstract class info{
//
protected $send=null;
//获得
public function __construct($send){
$this->send=$send;
}
//加工短信内容方法。
abstract public function msg($content);
//发送信息方法。
public function send($to,$content){
$content=$this->msg($content);
$this->send->send($to,$content);
}
}
//站内发送方式。
class zn {
public function send($to,$con){
echo "站内给:".$to." 内容是:".$con;
}
}
//邮箱发送方式。
class email {
public function send($to,$con){
echo "email给:".$to." 内容是:".$con;
}
}
//短信发送方式。
class sms {
public function send($to,$con){
echo "sms给:".$to." 内容是:".$con;
}
}
//普通发送方式。
class commonInfo extends info{
public function msg($con){
return $con."【普通】";
}
}
//紧急发送方式。
class warnInfo extends info{
public function msg($con){
return $con."【紧急】";
}
}
//特急发送方式。
class dangerInfo extends info{
public function msg($con){
return $con."【特急】";
}
}
//实现发送功能。
/**
* 步骤是:
* 实例化一种发送方式,将实例化后的对象传给发送方式。
* 发送方式实现了抽象发送类,所以会先将当前对象赋给一个属性。
* 然后通过调用抽象发送类的 send ,去实现处理信息内容再发送。
*/
$common=new commonInfo(new zn());
$common->send("小王","回家啦");
echo '<hr>';
$common=new commonInfo(new sms());
$common->send("小王","回家啦");
?>
最新文章
- 配置iis时,浏览项目提示 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
- 复制Eclipse工作空间设置
- 监控Mysql主从环境下Slave延迟状态的操作记录
- Linux之sed命令详解
- opencv的实用研究--分析轮廓并寻找边界点
- When not to automate 什么时候不进行自动化
- 强制关闭myeclipse出现的问题
- MongoDB 分片操作
- linux命令行模式下实现代理上网(转)
- java字节中的基本类型的职业的数目 (采访总是问)
- Django中ORM模型总结(一)[概述,查询语句]
- 关于select的一个错误---属性选择器
- #pragma预处理命令
- c++给数组整体赋初值
- hadoop streaming 中跑python程序,自定义模块的导入
- jQuery-3.事件篇---鼠标事件
- C++中的赋值运算符重载函数(operator=)
- 入门cout输出的格式(补位和小数精度)
- Two Sum ——经典的哈希表的题
- 常用的mysql语句
热门文章
- nyoj--1058--部分和问题(dfs)
- RBAC介绍
- Kali linux 2016.2(Rolling)中的payloads模块详解
- Ubuntu16.04 Mysql
- python 3.x 学习笔记15(多线程)
- 51nod 2020 排序相减(暴力解法)
- AOJ GRL_1_B: Shortest Path - Single Source Shortest Path (Negative Edges) (Bellman-Frod算法求负圈和单源最短路径)
- 优动漫PAINT-百褶裙绘制教程
- useradd: cannot open /etc/passwd
- [LeetCode] 155. minStack 设计最小栈