设计模式之桥接模式PHP实现

13 篇文章 1 订阅
2 篇文章 0 订阅

1.意图

将抽象部分和与它的实现部分分离,使它们都可以独立地变化。

2.别名

Handle/Body

3.动机

当一个抽象可能有多个实现的时,通常用继承来协调它们。抽象类定义对该抽象的接口而具体的子类则用不同的方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地修改,扩充和重用。


简明的说如上图:

桥接模式就是要实现A1可以通过桥调用B1也可以调用B2,A2可以通过桥调用B1,也可以调用B2

由于有了这座桥,使得桥两边的随着两端不同的维度进行变化,同时两端的事物又通过桥存在着一定的联系。


类图


示例代码:

<?php
/**
 * Created by PhpStorm.
 * User: yangy
 * Date: 2017/5/11
 * Time: 13:47
 */
//抽象类:电脑
abstract class Computer{
    protected $phone;

    public function __construct($phone)
    {
        $this->phone = $phone;
    }
    public  function &__get($property_name)
    {
        if(isset($this->$property_name))
        {
            return($this->$property_name);
        }
        else
        {
            return(NULL);
        }
    }
    public  function __set($property_name, $value)
    {
        $this->$property_name = $value;
    }
    public abstract function connect();
}
//接口:手机
interface Phone{
    public function connectImpl();
}
//华硕品牌的电脑
class  ASUSComputer extends Computer{
    public function __construct($phone)
    {
        $this->phone=$phone;
    }
    public function connect()
    {
        echo "华硕电脑";
        $this->phone->connectImpl();
    }
}
//戴尔品牌的电脑
class DellComputer extends Computer{
    public function __construct($phone)
    {
        $this->phone=$phone;
    }
    public function connect()
    {
        echo "戴尔电脑";
        $this->phone->connectImpl();
    }

}
//三星手机
class  SamsungPhone implements Phone{
    public function connectImpl()
    {
        echo "连接了三星手机\n";
    }
}
//小米手机
class XiaomiPhone implements Phone{
    public function connectImpl()
    {
        echo "连接了小米手机\n";
    }
}
//抽象类:人
abstract class Person{
    public $computer;
    public function __construct($computer)
    {
        $this->computer = $computer;
    }
    public abstract function useComputer();
}
//学生
class Student extends Person{
    public function useComputer()
    {
        echo "学生使用";
        $this->computer->connect();
    }

}
 //老师
class Teacher extends Person{
    public function useComputer()
    {
        echo "教师使用";
        $this->computer->connect();
    }

}
function main(){
    //华硕电脑连接了小米手机
    $asusComputer=new ASUSComputer(new XiaomiPhone());
    $asusComputer->connect();
    //戴尔电脑连接了三星手机
    $dellComputer=new DellComputer(new SamsungPhone());
    $dellComputer->connect();
    //学生使用华硕电脑连接了小米手机
    $student=new Student(new ASUSComputer(new XiaomiPhone()));
    $student->useComputer();
    //教师使用戴尔电脑连接了三星手机
    $teacher=new Teacher(new DellComputer(new SamsungPhone()));
    $teacher->useComputer();
}
main();
输出结果:

华硕电脑连接了小米手机
戴尔电脑连接了三星手机
学生使用华硕电脑连接了小米手机
教师使用戴尔电脑连接了三星手机

4.适用性

1.不希望在抽象和它的实现部分之间有一个固定的绑定关系。列如在程序运行时刻实现部分应可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类方法加以扩充。这时的桥接模式使你可以不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

4.想对客户完全隐藏抽象的实现部分。

5.有许多类要生成,类的层次结构说明你必须得将一个对象分解成两个部分。

6.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

5.与其他模式的关系

桥接模式和装饰模式:

  这两个模式在一定程度上都可减少子类的数目,避免出现复杂的继承关系,但是它们解决的方法却各有不同,装饰模式吧子类中比基类多出来的部分放到单独的类里面,以适应新功能的添加,把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过组合可以实现很多的功能组合。而桥接模式是把两个以上独立的抽象维度分离,使用聚合的方式使其关联,来达到减少子类的目的,结构上桥接模式比装饰模式要复杂。

桥接模式和适配器模式

它们的共同点是桥接和适配器都是让两个类配合工作,它们的区别是出发点不同,适配器的出发点是改变已有的两个接口,让它们相容,可以结合那些功能上相似但是接口不同的类,桥接模式的出发点是分离抽象化和实现化,是两者的接口可以不同,目的是分离。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值