您的位置:首页 > 其它

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

2016-07-18 11:30 645 查看
将抽象部分与它的实现部分分离,使它们都可以独立地变化。

一. 适用性

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组合一下不就行了

  桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: