变脸不变质的桥梁模式(Bridge Pattern)
有一哥们是搞山寨货的,什么流行就搞什么。自己有个厂子,前些时间服装挣钱,就生产衣服,如今搞手机挣钱,搞手机,这哥们非常聪明,就换了个产品,工人,厂房都不变。他是怎么做到的?用类图来模拟一下:

由类图能够看出这哥现有两家公司,一个搞房地产,一个搞山寨货(phone),房地产是长久渠道,山寨随时可能变更。
用PHP来实现:
<?php
abstract class Corp {
private $product;
public function __construct( Product $product ) {
$this->product = $product;
}
// protected abstract function produce();
// protected abstract function sell();
public function makeMoney() {
$this->product->beProducted();
$this->product->beSelled();
}
} class HouseCorp extends Corp{
public function __construct( House $house ) {
parent::__construct( $house );
}
public function makeMoney() {
parent::makeMoney();
echo "房地产公司挣大钱了。。。\n";
}
} class ShanZhaiCorp extends Corp{
public function makeMoney() {
parent::makeMoney();
echo "挣大钱了。。。\n";
}
} abstract class Product {
public abstract function beProducted();
public abstract function beSelled();
} class House extends Product{
public function beProducted() {
echo "房子生产出来是这样\n";
}
public function beSelled() {
echo "生产出来的房子被卖出去了\n";
}
} class Phone extends Product{
public function beProducted() {
echo "手机出来是这样\n";
}
public function beSelled() {
echo "生产出来的手机被卖出去了\n";
}
} $house = new House();
$houseCorp = new HouseCorp($house);
$houseCorp->makeMoney();
$shanzhaiCorp = new ShanZhaiCorp(new Phone());
$shanzhaiCorp->makeMoney();
执行结果:
房子生产出来是这样
生产出来的房子被卖出去了
房地产公司挣大钱了。。。
手机出来是这样
生产出来的手机被卖出去了
挣大钱了。。。
假设如今改做山寨ipad了,要如何改动?是不是仅仅须要添加�一个ipad产品类就可以?
桥梁模式的定义
桥梁模式也叫桥接模式,是一个比較简单的模式,其定义例如以下:将抽象和实现解耦,使得两者能够独立地变化。桥梁模式由四个角色组成:
1、Abstraction——抽象化角色
它的主要职责是定义出该角色的行为,同一时候保存一个对实现化角色的引用,该角色通常是抽象类
2、Implementor——实现化角色
它是接口或者抽象类,定义角色必须的行为和属性
3、RefinedAbstraction——修正抽象化角色
它引用实现化角色对抽象化角色进行修正
4、ConcreteImplementor——详细实现化角色
它实现接口或抽象类定义的方法和属性
桥梁模式的长处
1、抽象和实现分离
这也是桥梁模式的主要特点,它全然是为了解决继承的缺点而提出的设计模式。在该模式下,实现能够不受抽象的约束,不用再绑定在一个固定的抽象层次上。
2、优秀的扩充能力
仅仅要对外暴露的接口层同意这种变化,我们已经把变化的可能性减到最小。
3、实现细节对客户透明
客户不用关心细节的实现,它已经由抽象层通过聚合关系完毕了封装。
桥梁模式的使用场景
1、不希望或不适用使用继承的场景
比如继承层次过渡、无法更细化设计颗粒等场景,须要考虑使用桥梁模式
2、接口或抽象类不稳定的场景
明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失的,也是比較失败的做法。
3、重用性要求较高的场景
设计的颗粒度越细,则被重用的可能性越大,而採用继承受父类的限制,不可能出现太细的颗粒度。
桥梁模式的注意事项
横梁模式是很easy的,使用该模式时主要考虑怎样拆分抽象和实现,并非一涉及继承就要考虑使用该模式,那还要继承干什么呢?桥梁模式的意图还是对变化的封装,尽量把可能变化的因素封装到最细最小的逻辑单元中,避免风险扩散。因此在进行系统设计时,发现类的继承有N层时,能够考虑使用桥梁模式。
变脸不变质的桥梁模式(Bridge Pattern)的更多相关文章
- 桥梁模式(Bridge Pattern)
桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation) ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
桥接模式Bridge Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 说说设计模式~桥梁模式(Bridge)
返回目录 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? ...
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
随机推荐
- 替换 window.location当中的某个参数的值(而其它值不变)JS代码
在后台与前台的交互操作中,需要替换location当中的某个参数的值(而其它值不变)时,会用到以下函数: 说明: win:传入的窗口句柄,如,window或window.parent等forceAdd ...
- Android 图片处理效果集
总共可以处理出大约100种图片效果,常见的和不常见的滤镜效果可以处理出来,可以说涵盖了市面上所有特效相机可以处理出来的效果.项目所有代码都是纯java代码实现,没有封装成jar包.截图是挑选了几张有代 ...
- 星际反作弊2.3for-win7-xp-win8-win10
星际反作弊2.3for-win7-xp-win8-win10 下载地址 http://wj800.com/rar/scfzb.zip
- DjangoORM一对多&多对多操作
简要说明 通过操作对象的方式操作数据库 详细步骤 models.py的结构是: 如果models.py中外键定义没有写 related_name='student_teacher', 可以直接用 st ...
- 阿里云ECS每天一件事D8:nginx1.7整合php5.4
nginx本身的并不能解析php或者jsp,要转发给后端的php或者tomcat以及其他类似的应用程序服务器来提供服务. 首先我需要完成的配置是实现与php的整合,典型的配置信息如下: server ...
- FastCGI | FastCGI -
FastCGI | FastCGI - FastCGI About FastCGI FastCGI is simple because it is actually CGI with only a f ...
- POJ 1679:The Unique MST(次小生成树&&Kruskal)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19941 Accepted: 6999 D ...
- Android导航栏ActionBar的具体分析
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/39378825 关于ActionBar,相信大家并不陌生,可是真正能够熟练使用的也不是许多,这 ...
- xcode 工具栏中放大镜的替换的说明
1.如果是在打开的文档范围内: 查找: Command+ F 替换: Option+Command+F Replace All 是全部替 ...
- 传统web和mvc的区别