桥接模式:
将抽象与它的实现分离,使它们都可以独立的变化。
桥接模式组成:
1、抽象角色(Abstration):抽象类或者接口,多维度变化的其中一个维度,抽象角包含实现角色的对象。抽象角色中的操作方法通过调用实现角色中的方法实现。
2、实现角色(Implementor):多维度变化的其中一个维度,实现角色定义具体的操作方法模板。
3、被提炼的抽象角色(RefinedAbstraction):继承自抽象角色。
4、具体实现角色(ConcreteImplementor):继承自实现角色,实现或重写实现角色中定义的操作方法。
实例代码:
现在有一给电脑安装系统为例,有联想电脑和戴尔电脑,我们可以为联想和戴尔电脑分别安装Windows系统或者安装Linux系统。电脑类和系统类都是多变的角色。
// 抽象角色 电脑类
class Computer {
// 包含CSystem类的对象
protected CSystem system;
public void SetComputer(CSystem cSystem) {
// TODO Auto-generated constructor stub
this.system = cSystem;
}
public void InstallSystem(){
system.InstallSystem();
}
}
// 实现角色 操作系统
interface CSystem {
public void InstallSystem();
}
// 被提炼的抽象角色 联想电脑
public class Lenovo extends Computer {
public void InstallSystem(){
System.out.println("联想电脑");
system.InstallSystem();
}
}
// 戴尔电脑
public class Dell extends Computer {
public void InstallSystem(){
System.out.println("戴尔电脑");
system.InstallSystem();
}
}
// 具体的实现角色
// Linux系统
public class Linux implements CSystem {
@Override
public void InstallSystem() {
// TODO Auto-generated method stub
System.out.println("安装Linux系统。");
}
}
// win系统
public class Windows implements CSystem {
@Override
public void InstallSystem() {
// TODO Auto-generated method stub
System.out.println("安装Windows系统。");
}
}
uml图:
分析:
以上代码可以从电脑和系统两个维度去分类实现对象,如果使用继承,每增加一个品牌电脑或者操作系统,将增加很多的类,不能满足开放-封闭原则。此时,使用桥接模式,增加一个品牌是只需要增加一个类即可,并且可以沿着电脑类或系统类方向发展而不增加复杂度。
设计要点:
处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承模块,使各个维度可以独立的拓展在抽象层。
适用性:
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者
1449

被折叠的 条评论
为什么被折叠?



