<?php
/**
 * 【桥接模式(针对 二维模型)】
 * 对于多维度需要处理的事情,多耦合
 * 第一维度,发送信息的类型:站内信、email、手机短信
 * 第二维度,发送信息的紧急程度:普通、加急、特级
 * (说明)桥接模式只需要 A+B种类,但是常规的需要 A*B种类;
 *            维度越多,各维度下的分类越多,桥接模式越有优势!
 *
 */

header("Content-type: text/html; charset=utf-8");

/**
 * 抽象的信息类
 */
abstract class Msg{
    protected $send = null; //发送器
    public function __construct($send){
        $this->send = $send;
    }

    abstract public function msg($content); //信的紧急程度
    public function send($to,$content){
        //对 $content 进行加工
        $content = $this->msg($content);
        //执行发送
        $this->send->send($to,$content);
    }
}

/**
 * 按照 信息类型 划分三个类
 */
class Web{ //站内信
    public function send($to,$content){
        echo "[站内信]发给 $to [内容] $content";
    }
}
class Email{ //Email信
    public function send($to,$content){
        echo "[Email]发给 $to [内容] $content";
    }
}
class Sms{ //手机短信
    public function send($to,$content){
        echo "[手机短信]发给 $to [内容] $content";
    }
}

/**
 * 按照 紧急程度 划分三个类
 */
class PtMsg extends Msg{ //普通
    public function msg($content){
        return $content.'【信件类型是 普通信】';
    }
}
class JjMsg extends Msg{ //加急
    public function msg($content){
        return $content.'【信件类型是 加急信】';
    }
}
class TjMsg extends Msg{ //特急
    public function msg($content){
        return $content.'【信件类型是 特急信】';
    }
}

/*---------- 客户端开始任意随机配对调用 ---------*/
//发送【普通】的【站内信】
$pt_web_msg = new PtMsg(new Web());
$pt_web_msg->send('小明','吃饭了');
echo '<hr>';

//发送【特急】的【站内信】
$tj_web_msg = new TjMsg(new Web());
$tj_web_msg->send('张三','去跑步了');
echo '<hr>';

//发送【加急】的【Email】
$jj_email_msg = new JjMsg(new Email());
$jj_email_msg->send('李四','在看书');
echo '<hr>';

//发送【普通】的【手机短信】
$pt_sms_msg = new PtMsg(new Sms());
$pt_sms_msg->send('武松','打老虎');
echo '<hr>';

/************** [ 如下为传统方式,比较麻烦 ] **************/

/**
 * 需求:给用户发信息
 * 第一维度,发送信息的类型:站内信、email、手机短信
 * 第二维度,发送信息的紧急程度:普通、加急、特级
 * 按照常规思路如下:需要 3*3=9 个类!!
 */
interface MsgTmp{
    public function send($to,$content);
}
//站内 普通信
class WebPT implements MsgTmp{
    public function send($to,$content){
        echo "[站内信]发给 $to [内容] $content ";
    }
}
//Email 普通信
class EmailPT implements MsgTmp{ //...
    public function send($to,$content){}
}
//手机短信 普通信
class SmsPT implements MsgTmp{ //...
    public function send($to,$content){}
}
//站内 加急信    class WebJJ implements MsgTmp{}
//Email 加急信    class EmailJJ implements MsgTmp{}
//手机短信 加急信    class SmsJJ implements MsgTmp{}

//站内 特急信    class WebTJ implements MsgTmp{}
//Email 特急信    class EmailTJ implements MsgTmp{}
//手机短信 特急信    class SmsTJ implements MsgTmp{}

【PHP设计模式 11_QiaoJie.php】桥接模式(针对 二维模型)的更多相关文章

  1. Java设计模式之《桥接模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...

  2. java23种设计模式——七、桥接模式

    原文地址:https://www.cnblogs.com/chenssy/p/3317866.html 源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 j ...

  3. 实例解析Python设计模式编程之桥接模式的运用

    实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...

  4. 【读书笔记】读《JavaScript设计模式》之桥接模式

    桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化. 一.使用场景 使用场景一:事件监控 对于前端而言,最典型的使用场景——事件监控.如—— addEvent(element ...

  5. Java设计模式系列之桥接模式

    桥接模式(Bridge)的定义 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地 ...

  6. java设计模式-----14、桥接模式

    Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstraction ...

  7. 设计模式学习心得<桥接模式 Bridge>

    说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...

  8. IOS设计模式浅析之桥接模式(Bridge)

    引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...

  9. C#设计模式系列:桥接模式(Bridge)

    1.桥接模式简介 1.1>.定义 当一个抽象可能有多个实现时,通常用继承来进行协调.抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现.继承机制将抽象部分与它的实现部分固定在一起,使得 ...

随机推荐

  1. 一表格简单明了区分BI和大数据

    大数据和BI两词现阶段处于刷屏状况,但是,很多人对于这两词确傻傻分不清.改怎么区别呢?本文将从概念.应用.发展趋势等多个角度对大数据和BI进行区分. BI(Business Intelligence) ...

  2. HtmlAgilityPack教程

    解析html教程(重点) http://www.cnblogs.com/kissdodog/archive/2013/02/28/2936950.html 完整的教程 http://www.cnblo ...

  3. 前端学习——css基础知识,选择器与html模板、值得收藏的html标签

    一.css需要的html(采用html5标准) DTD,文档类型声明: <!Doctype html> 文本编码声明: <meta charset="utf-8" ...

  4. YII实现Memcache故障转移的配置办法

    YII在默认配置下连接Memcache失败时会报错,要想实现故障转移就要改一下配置和代码 1.首先修改一下YII的 caching/CMemCache.php,我的版本是 1.1.7 找到 $cach ...

  5. MongoDB(一):安装

    安装 从度娘上搜索MongoDB,找到官网地址:https://www.mongodb.com 找到下载中心地址:https://www.mongodb.com/download-center 我下载 ...

  6. Vue.js实例练习

    最近学习Vue.js感觉跟不上节奏了,Vue.js用起来很方便. 主要实现功能,能添加书的内容和删除.(用的Bootstrap的样式)demo链接 标题用了自定义组件,代码如下: components ...

  7. Hibernate Annotation笔记

    (1)简介:在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准.它非常强大.灵活,而且具备了优异的性能.在本文中,我们将了解如何使用Java 5 注释来简化Hiberna ...

  8. Hdu-3487 Splay树,删除,添加,Lazy延迟标记操作

    HDU_3487 题意:给出n和q,n代表1-n的序列,接下来q有两种操作,Cut a b c:表示把区间[a,b]截掉然后放在第c个数的后面,Flip a b 表示把区间[a,b]反转,经过一系列的 ...

  9. 通过struts.xml搭建、为属性注入值_2015.01.04

    01:web.xml配置: <?xml version="1.0" encoding="UTF-8"?> <web-app version=& ...

  10. DDR3命令状态(二)

    DDR3中的状态机Diagram,详见相册. ACT:Activate,表示输出行地址,和是否自动precharge控制位. PRE:Precharge,在读写后,可以根据A10来判断是否自己进行pr ...