您的位置:首页 > 其它

设计模式学习之桥梁模式

2017-03-25 14:23 204 查看
什么是桥梁模式?

    桥梁模式是将抽象与实现解耦,使得两者可以独立的变化。那么我们的重点就是如何将抽象与实现解耦?

桥梁模式的关键是什么?

    如下如为桥梁模式的类图,其中的关键就是Abstraction和Implementor的关系。Abstraction为抽象角色,Implementor为实现角色,其中抽象类依赖实现类。

    


    下面我们看一下桥梁模式的四个角色:

Abstraction - 抽象化角色:它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
Implementor - 实现化角色:它是接口或者抽象类,定义角色必须的行为和属性。
RefinedAbstraction - 修正抽象化角色:它引用实现化角色对修正化角色进行修正。
ConcreteImplementor - 具体实现化角色:它实现接口或抽象类定义的行为和属性。
    对于桥梁模式,主要解决的是多个模式控制下的复杂性,例如我们搬家时会准备很多箱子,包括有纸箱、布箱,有大箱子、中箱子、小箱子等。我们的UML设计如下:



    SizeImpl接口(实现化角色)代码:
public interface SizeImpl {

public int size();
}
    Big类(具体实现化角色)代码:
public class Big implements SizeImpl {

@Override
public int size() {
return 20;
}
}
    Small类(具体实现化角色)代码:
public class Small implements SizeImpl {

@Override
public int size() {
return 5;
}
}
    AbstractBox抽象类(抽象化角色)代码:
public abstract class AbstractBox {

private SizeImpl size;

public SizeImpl getSize() {
return size;
}

public void setSize(SizeImpl size) {
this.size = size;
}

public abstract void makeBox();

}
    PaperBox类(修正抽象化角色)代码:
public class PaperBox extends AbstractBox {

@Override
public void makeBox() {
System.out.println("material:paper");
System.out.println("size:" + getSize().size());
}
}
    client代码:
public class BoxClient {

public static void main(String[] args) {
PaperBox paperBox = new PaperBox();
paperBox.setSize(new Big());
paperBox.makeBox();
}

}
    执行结果如下:
material:paper
size:20
    这样做的好处是如果我们想扩展皮箱,不需要再去定义大皮箱、中皮箱、小皮箱三个类,只需要定义一个皮箱类。
桥梁模式的优点
实现抽象与现实的分离,很好的解决了继承的缺点。
优秀的扩展能力。
实现细节对客户透明。
桥梁模式的使用场景

系统需要再抽象化角色与具体化角色之间增加更多灵活性。
客户端要求实现化角色的任何改变不影响客户端。
一个构建有多于一个的抽象化角色和实现化角色。
虽然系统中使用继承没有问题,但是系统中的抽象化角色与具体化角色需要独立变化。

参考
http://blog.csdn.net/xingjiarong/article/details/50132727
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: