学习php设计模式 php实现桥梁模式(bridge)


Posted in PHP onDecember 07, 2015

一、桥梁模式结构图

 学习php设计模式 php实现桥梁模式(bridge)

二、桥梁模式中主要角色
抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:定义实现类的接口,不给出具体的实现。此接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以完全不同。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:实现实现化角色接口并定义它的具体实现。
三、桥梁模式的优点
1、分离接口及其实现部分
将Abstraction与Implementor分享有助于降低对实现部分编译时刻的依赖性
接口与实现分享有助于分层,从而产生更好的结构化系统
2、提高可扩充性
3、实现细节对客户透明。
四、桥梁模式适用场景
1、如果一个系统需要在构件的抽象化和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2、设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3、一个构件有多于一个的抽象化角色和实现化角色,并且系统需要它们之间进行动态的耦合。
4、虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
五、桥梁模式与其它模式
抽象工厂模式(abstract factory模式):抽象工厂模式可以用来创建和配置一个特定的桥梁模式。
适配器模式(adapter模式):适配器模式用来帮助无关的类协同工作。它通常是在系统设计完成之后才会被使用。然而,桥梁模式是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
状态模式(state模式):桥梁模式描述两个等级结构之间的关系,状态模式则是描述一个对象与状态对象之间的关系。状态模式是桥梁模式的一个退化的特殊情况。
六、桥梁模式PHP示例

<?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 />';
 }
}
 
/**
 * 客户端
 */
class Client {
 
 /**
 * Main program.
 */
 public static function main() {
 $abstraction = new RefinedAbstraction(new ConcreteImplementorA());
 $abstraction->operation();
 
 $abstraction = new RefinedAbstraction(new ConcreteImplementorB());
 $abstraction->operation();
 }
}
 
Client::main();
?>

以上就是使用php实现桥梁模式的代码,还有一些关于装饰模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP 变量类型的强制转换
Oct 23 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
array_multisort实现PHP多维数组排序示例讲解
Jan 04 PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 PHP
PHP图片验证码制作实现分享(全)
May 10 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
PHP导出Excel实例讲解
Jan 24 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
PHP关于foreach复制知识点总结
Jan 28 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 #PHP
PHP函数func_num_args用法实例分析
Dec 07 #PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 #PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 #PHP
学习php设计模式 php实现建造者模式
Dec 07 #PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 #PHP
PHP面向对象详解(三)
Dec 07 #PHP
You might like
php数组总结篇(一)
2008/09/30 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
web性能优化之javascript性能调优
2012/12/28 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
详解js中==与===的区别
2017/01/08 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
Python time库基本使用方法分析
2019/12/13 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
写自荐信三大法宝
2014/01/24 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
Java对文件的读写操作方法
2022/04/29 Java/Android