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

由类图能够看出这哥现有两家公司,一个搞房地产,一个搞山寨货(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)的更多相关文章

  1. 桥梁模式(Bridge Pattern)

    桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation) ...

  2. 桥接模式(Bridge Pattern)

    1,定义           桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...

  3. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

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

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

  5. 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)

      桥接模式Bridge   Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来   意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展.  意图解析 依赖倒置原 ...

  6. 【设计模式】桥接模式 Bridge Pattern

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  7. 二十四种设计模式:桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...

  8. 说说设计模式~桥梁模式(Bridge)

    返回目录 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? ...

  9. Net设计模式实例之桥接模式( Bridge Pattern)

    一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...

随机推荐

  1. Svn服务启动的两种方式

    一.svn服务器启动 › cmd命令行启动:vsvnserve -d –r 文档仓库路径 -d 后台执行 › -r 版本库的根目录 二.›Windows服务自动启动     利用xp.2000 以上的 ...

  2. 一周学会Mootools 1.4中文教程:(4)类型

    Mootools的类型主要包含下边几部分:String:字符串;Number:数字;Array:数组;Object:对象;Json:;Cookie:. 这也是我们今天的讲述重点.每一种数据类型Mt都为 ...

  3. BOM 浏览器对象模型学习

    window对象属性 innerWidth/innerHeight 浏览器窗口的内部宽度与高度 outerWidth/outerHeight 浏览器的外部宽度与高度 length window.fra ...

  4. 初识C(1)----与C基本无关的开篇

    1.啥叫编程 编程乃编写程序的简称,所以要想知道啥叫编程,首先要清楚什么是程序(Program). 普及一点计算机小知识:从根本上说,计算机是由数字电路组成的运算机器,处理的数字也仅限于0和1组成的数 ...

  5. 《Pointers On C》读书笔记(第三章 数据)

    1.在C语言中,仅有4种基本数据类型:整型.浮点型.指针和聚合类型(如数组和结构等). 整型家族包括字符.短整型.整型和长整型,它们都分为有符号和无符号两种. 标准规定整型值相互之间大小的规则:长整型 ...

  6. RIA Service 的 SOAP EndPoint

    原文 www.cyqdata.com/cnblogs/article-detail-39983-english 越来越多的朋友都在使用Silverlight开发应用程序,其中我们常用的还会有一个特殊的 ...

  7. addEventlistener监听的事件完成一次后自动取消与jquery的one方法比较;animate动画制作,arguments.callee的用法

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. HTML5 RPG游戏示例

    演示地址 点击打开链接

  9. spring IOC简单入门

    spring的核心是ioc和aop 先介绍一下IOC(inverse of control控制反转)又叫DI(Dependency injection依赖注入) 个人理解为把对象的控制权由类转移到配置 ...

  10. POJ 2253 Frogger floyd算法

    题目:click here 题意: 给出两只青蛙的坐标A.B,和其他的n-2个坐标,任意两坐标间是双向连通的.显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中 ...