一个抽象产生多种具体的实现方式,单纯的通过子类继承会有子类爆炸(过多的子类产生)的现象,系统需要它们之间进行动态耦合。

面向过程:

<?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("小王","回家啦");
?>

php八大设计模式之桥接模式的更多相关文章

  1. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  2. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  3. php设计模式之桥接模式

    php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...

  4. java设计模式7——桥接模式

    java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...

  5. C++设计模式-Bridge桥接模式

    作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...

  6. 设计模式之桥接模式(Bridge)

    注:本文不属于原创,而是根据原文重新整理,原文是:我给媳妇解释设计模式:第一部分 设计模式不是基于理论发明的.相反,总是先有问题场景,再基于需求和情景不断演化设计方案,最后把一些方案标准化成“模式”. ...

  7. 【GOF23设计模式】桥接模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_桥接模式.多层继承结构.银行日志管理.管理系统消息管理.人力资源的奖金计算  未用桥接模式: package com.te ...

  8. js设计模式(3)---桥接模式

    0.前言 看设计模式比较痛苦,一则是自己经验尚浅,不能体会到使用这些设计模式的益处:二则是不能很好把握使用这些设计模式的时机.所以这一部分看得断断续续,拖拖拉拉,为了了却这快心病,决定最近一口气看完几 ...

  9. [设计模式] 7 桥接模式 bridge

    #include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...

随机推荐

  1. VMware虚拟机ubuntu显示屏幕太小解决办法

    使用VMware安装的ubuntu虚拟机的显示屏幕太小,可以通过在VMware里安装"VMware Tool"插件解决,安装步骤记录一下. 1. 更改ISO文件路径 安装VMwar ...

  2. ASP.NET MVC5 历史数据查询

    在TCX_1706项目中在历史数据库备份及历史数据查询的功能,历史数据包括历史采集数据查询和历史产品数据查询两个 在项目中如何查询历史库的历史表呢? 第一步:在配置文件中添加历史库的链接字符串 第二步 ...

  3. SpringMVC学习(二)——SpringMVC架构及组件(及其运行原理)-转载

    相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上一篇文章中SpringMVC的处理流程吗?  这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来说比 ...

  4. DotNetCore.1.0.1-VS2015Tools.Preview2.0.3 相关问题及解决办法

    本月16号,MS发布了 .NET Core 1.1.作为一个用贯MS产品的小盆友,我第一时间就把相关的安装包下载下来了,然后果断安装(入坑). 我猜你来看这篇博客可能遇到了和我一样的问题. 问题0:正 ...

  5. js闭包详解-转自好友trigkit4

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数 ...

  6. for 的相关用法

    forEach() <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  7. 算法38---292. Nim游戏

    1.题目: 你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函 ...

  8. [codevs3955]最长严格上升子序列(加强版)

    题目大意:给你一个序列,要你求该序列中最长严格上升子序列的长度. 解题思路:此题算是一道LIS模板题.普通的$O(n^2)$的LIS是会TLE的,因为$n\le 1000000$,所以此题要用单调队列 ...

  9. 【Tool】Linux下的Spark安装及使用

    1. 确保自己的电脑安装了JAVA Development Kit JDK, 用来编译Java应用, 如 Apache Ant, Apache Maven, Eclipse. 这里是我们安装Spark ...

  10. 【BZOJ 1083】 [SCOI2005]繁忙的都市

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 很明显的最小生成树了. 输出最后选的那条边就好了. [代码] #include <bits/stdc++.h> usin ...