桥接模式和php实现

桥接模式(Bridge Pattern):
  将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

桥接模式包含如下角色:
  Abstraction:抽象类
  RefinedAbstraction:扩充抽象类
  Implementor:实现类接口
  ConcreteImplementor:具体实现类

UML图:

  

理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。
实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。

优点:
  分离抽象接口及其实现部分。
  桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
  桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  实现细节对客户透明,可以对用户隐藏实现细节。
缺点:
  桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进
  行设计与编程。 - 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

适用环境:
  如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
  一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
  虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
  对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

代码实现:

<?php
//抽象化角色,抽象化给出的定义,并保存一个对实现化对象的引用。
abstract class Abstraction {
    /* 对实现化对象的引用 */
    protected $imp;
    //其操作方法
    public function operation() {
        $this->imp->operationImp();
    }
}
//修正抽象化角色,扩展抽象化角色,改变和修正父类对抽象化的定义。
class RefinedAbstraction extends Abstraction {
     public function __construct(Implementor $imp) {
        $this->imp = $imp;
    }
   //操作方法在修正抽象化角色中的实现
    public function operation() {
        echo ‘RefinedAbstraction operation  ‘;
        $this->imp->operationImp();
    }
}
 //实现化角色,给出实现化角色的接口,但不给出具体的实现。
abstract class Implementor {
    //操作方法的实现化声明
    abstract public function operationImp();
}

//具体化角色A,给出实现化角色接口的具体实现
class ConcreteImplementorA extends Implementor {
    //操作方法的实现化实现
    public function operationImp() {
        echo ‘Concrete implementor A operation <br />‘;
    }
}
 //具体化角色B  给出实现化角色接口的具体实现
class ConcreteImplementorB extends Implementor {
    //操作方法的实现化实现
    public function operationImp() {
        echo ‘Concrete implementor B operation <br />‘;
    }
}

具体实例:

//实现各种操作系统都能播放MPEG,AVI,WMV格式的视频
//抽象类,定义操作系统
abstract class OperationSystem{
     public $musicParren;
     function playMpeg(){
            $this->musicParren->playMpeg();
     }
     function playWmv(){
            $this->musicParren->playWmv();
     }
     function playAvi(){
            $this->musicParren->playAvi();
     }
}

//扩展抽象类,定义Linux的播放模式
class linux extends OperationSystem{
     function __construct(MusicParren $musicParren){
          $this->musicParren = $musicParren;
     }
}
//扩展抽象类,定义Linux的播放模式
class Windows extends OperationSystem{
     function __construct(MusicParren $musicParren){
          $this->musicParren = $musicParren;
     }
}
//扩展抽象类,定义Unix的播放模式
class Unix extends OperationSystem{
     function __construct(MusicParren $musicParren){
          $this->musicParren = $musicParren;
     }
}

//实现类接口
abstract class MusicParrenInterface{
    abstract function playMpeg();
    abstract function playWmv();
    abstract function playAvi();
}
//具体实现类
class MusicParren extends MusicParrenInterface{
    function playMpeg(){
        echo "播放Mpeg格式的视频";
    }
    function playWmv(){
        echo "播放Wmv格式的视频";
    }
    function playAvi(){
        echo "播放Avi格式的视频";
    }

}

//测试
$operationSystem = new Windows(new MusicParren());
$operationSystem->playMpeg();
$operationSystem->playAvi();
时间: 2024-12-18 14:49:57

桥接模式和php实现的相关文章

设计模式 -- 桥接模式(Bridge Pattern)

桥接模式 Bridge Pattern 结构设计模式 定义: 分离抽象部分和实现部分,使他们独立运行. 避免使用继承导致系统类个数暴增,可以考虑桥接模式. 桥接模式将继承关系转化为关联关系,减少耦合,减少代码量. 例如: public interface Shape { public void bepaint(String color); } public abstract class Color { Shape shape; public void setShape(Shape shape)

设计模式——桥接模式

场景,我们需要给不同的电视厂商,比如长虹.TCL.三星等等生产电视遥控器.他们提供各自电视机遥控功能的实现,并且遵循一样的标准. 我们制作一个长虹的遥控器,选择最直接的方式,继承长虹类,然后利用长虹类提供的方法,实现遥控器功能. 在这个遥控器中,我们提供了新功能,比如 1)将开和关放在一个按钮 2)下一个频道 3)上一个频道 public class CHTvControl extends CHControl implements TvControl{ private static int ch

浅说解决VMware桥接模式连接主机

内容概要: 1: 搞懂VMware的桥接,NAT,HostOnly三种模式的意义. 2: 分别示范,CentOS 6,CentOS 7的手动分配固定虚拟机的IP地址. 3: 使用桥接方法ping通主机,并用Xshell远程控制. 解决的问题: 1: 虚拟机上不了网. 2: 无法ping通主机或远程连接. 3: 网卡启动总是失败,报错. 写作目的: 初装linux后,我们会习惯性的ping一下主机,看看虚拟机是否和主机连接正常,若正常便会迫不及待的用Xshell远程连接虚拟机,进行验证并操作.可安

9,桥接模式(Bridge Pattern)是将抽象部分与实际部分分离,使它们都可以独立的变化。

Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任. 它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展.  适用于: 桥接模式(Bridge Pattern)是将抽象部分与实现部分分离(解耦合),使它们都可以独立的变化. 车 安装 发动机 :不同型号的车,安装不同型号的发动机        将"车

【结构型模式】《大话设计模式》——读后感 (13)手机软件何时能统一?——桥接模式

桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变换[DP] 概述:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式. 桥接模式的基本代码: 唯独一: AbstractCar: package com.sjmx.bridge; public abstract class AbstractCar { void r

6 结构型模式之 - 桥接模式

桥接模式的介绍:桥接模式,也称为桥梁模式,是结构型设计模式之一,在现实tgitk大家都知道"桥梁"是连接河道两岸的主要交通枢纽,简而言之其作用就是连接河的两边,而我们的桥梁模式与现实中的情况很是相似,也是承担着连接两边的作用. 桥接模式的定义:将抽象部分与实现部分分离,使它们都可以独立地进行变化 格拉模式的使用场景:从模式的定义中我们大致可以了解到,这里"桥梁"的作用其实就是连接"抽象部分"与"实现部分",但是事实上,任何多维

Java设计模式:桥接模式

问题提出 生活中有很多事物集合,设为A1,A2......Am ,而每个事物都有功能F1,F2....Fn. 例如邮局的发送业务.简单模拟有两类事物:信件和包裹,均有平邮和挂号邮寄功能.程序设计中如何来描述这些功能呢?或许一般会与下面代码相似. public class A1 { void F1(){} void F2(){} } public class A2 { void F1(){} void F2(){} } 很明显,若有m个事物,n个功能,按照这个方法,一共要写m个类,功能方法累积起来

java设计模式之桥接模式

桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类.这两种类型的类可被结构化改变而互不影响.我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法.其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆. 桥接模式所涉及的角色有:抽象化(Abstraction)角色:抽象化给出的

桥接模式

一.目录概要 二.场景问题 假设要设计一个电脑商场管理系统的某个模块设计,电脑分为品牌和类型两个纬度,我们应该怎么解决?我们初学者最容易想到的办法就是利用继承的方式,那利用继承实现的类图又是什么样子呢?我们看图. 代码展示 package com.aaron.bridge; public interface Computer { public void sale(); } class Desktop implements Computer{ @Override public void sale(

23种设计模式--桥接模式

一.桥接模式的介绍 桥接其实说白就是走近路嘛,来个简单例子来说班级要到B地区去旅游,但是不是集体组织去,自己去到B地就可以了,这样就会诞生三种出行方式,那就是水,路,空,桥接的意思就是将水,路,空这三个地方建立一个港口,那样大家到B地区的中转战始终就是一个,大概的意思就是这,虽然有点不恰当,但是我感觉这样一说大家会比较明朗一点:不行就再来一个例子,存钱的例子来说吧,众所周知的,中国有四大行(工,农,中,建),你选择去某家存钱,存钱的方式有三种(活期,定期),但是银行不止这几家杭州银行等等本地新兴