桥接模式
2020-06-22 本文已影响0人
nieniemin
什么是桥接模式
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
模式角色
Abstraction抽象化(Brand)角色:定义抽象类,并包含一个对实现化对象的引用。
Refined Abstraction扩展抽象化(IPhoneBrand ,MiPhoneBrand )角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
Implementor实现化(Color)角色:定义实现化角色的接口,供扩展抽象化角色调用。
Concrete Implementor具体实现化(BlackColor)角色:给出实现化角色接口的具体实现。
UML类图
![](https://img.haomeiwen.com/i10195209/e1409ec4f29b5b54.png)
代码实现
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。用桥接模式就能很好地解决这些问题。使用桥接模式来模拟购买手机。选购手机选择品牌(brand)是一个维度,手机颜色(Color)是一个维度,供扩展抽象化角色(brand)调用。
public interface Color {
void phoneColor();
}
public class BlackColor implements Color {
@Override
public void phoneColor() {
System.out.println("黑色");
}
}
public class RedColor implements Color {
@Override
public void phoneColor() {
System.out.println("红色");
}
}
public abstract class Brand {
//实现化角色,供扩展抽象化角色使用
protected Color color;
protected void setColor(Color color) {
this.color = color;
}
public abstract void phoneBrand();
}
public class IPhoneBrand extends Brand {
@Override
public void phoneBrand() {
System.out.println("购买了苹果手机,颜色为:");
color.phoneColor();
}
}
public class MiPhoneBrand extends Brand {
@Override
public void phoneBrand() {
System.out.println("购买了小米手机,颜色为:");
color.phoneColor();
}
}
public class Client {
public static void main(String[] args) {
Brand iPhoneBrand = new IPhoneBrand();
iPhoneBrand.setColor(new BlackColor());
iPhoneBrand.phoneBrand();
Brand miPhoneBrand = new MiPhoneBrand();
miPhoneBrand.setColor(new RedColor());
miPhoneBrand.phoneBrand();
}
}
优点
由于抽象与实现分离,所以扩展能力强;
其实现细节对客户透明。
缺点
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
桥接模式完整代码