设计模式(七):桥接模式Bridge(结构型模式)

来源:互联网 发布:程序员用英语怎么说 编辑:程序博客网 时间:2024/05/29 14:52

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

一. 适用性

1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。

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

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

4.(C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的
有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh 称这种类层次结构为“嵌套的普化”(nested generalizations )。

5.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是Coplien 的String 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p )。

二.参与者

1.Abstraction
定义抽象类的接口。
维护一个指向Implementor类型对象的指针。

2.RefinedAbstraction
扩充由Abstraction定义的接口。

3.Implementor
定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。
事实上这两个接口可以完全不同。
一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。

4.ConcreteImplementor
实现Implementor接口并定义它的具体实现。

三.实例

package com.zoey.designPattern.Bridge;public abstract class WardrobeMaker {    abstract public  void produce();}
package com.zoey.designPattern.Bridge;/* * 衣柜 */public abstract class Wardrobe {    //衣柜厂商    protected WardrobeMaker wardrobeMaker;    //放置衣物    abstract public void placeClothing(WardrobeMaker wardrobeMaker);}
package com.zoey.designPattern.Bridge;public class BigMaker extends WardrobeMaker {    public BigMaker(){        System.out.println("big厂商");    }    @Override    public void produce() {        System.out.println("big厂商");    }}
package com.zoey.designPattern.Bridge;public class BigWardrobe extends Wardrobe {    @Override    public void placeClothing(WardrobeMaker wardrobeMaker) {        System.out.println("一个big衣柜");    }}
package com.zoey.designPattern.Bridge;public class SmallMarker extends WardrobeMaker {    public SmallMarker(){        System.out.println("small厂商");    }    @Override    public void produce() {        System.out.println("small厂商");    }}
package com.zoey.designPattern.Bridge;public class SmallWardrobe extends Wardrobe {    @Override    public void placeClothing(WardrobeMaker wardrobeMaker) {        System.out.println("一个small衣柜");    }}
package com.zoey.designPattern.Bridge;public class Test {    public static void main(String[] args) {        BigWardrobe bw = new BigWardrobe();        bw.placeClothing(new BigMaker());        SmallWardrobe sw = new SmallWardrobe();        sw.placeClothing(new SmallMarker());    }}

结果:

big厂商一个big衣柜small厂商一个small衣柜

形象比喻:摘自网络

BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了
  桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

0 0
原创粉丝点击