文章目录
桥接模式
背景:在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。 如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。
概念:将抽象与实现分离,使它们可以独立变。它是用组合关系代替继承关系来实现,从而降低了抽象类和实现这两个可变维度的耦合度
角色:
- 抽象化角色(抽象类):包含一个实现化角色的对象
- 扩展抽象化角色(实现类)
- 实现化角色(接口):供抽象化角色调用
- 具体实现化角色:实现了实现化角色的实现类
适用场景:
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数暴增时
- 当一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性时
案例分析:(女士买包)
女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度变化,因此采用桥接模式来实现女士皮包的选购比较合适。本例采用按用途和颜色分,分别为:钱包(Wallet)/挎包(HandBag),黄色(Yellow)/红色(Red),这是用两个维度来定义颜色和包类。颜色类(Color)是一个维度,定义为实现化角色,它有两个具体实现化角色(黄色和红色),包类是另一个维度,定义为抽象化角色,它有两个扩展抽象化角色(挎包和钱包)且包含了颜色类对象。
案例实现:
1.包类-抽象化角色
public abstract class Bag {
//抽象化角色包含实现化角色的引用
protected Color color;
public Bag(Color color) {
this.color = color;
}
//用来获取颜色
abstract String getName();
}
2.具体实现化角色(接口)
public interface Color {
String getColor();
}
3.扩展抽象角色(实现抽象化角色)
public class Wallet extends Bag{
public Wallet(Color color) {
super(color);
}
@Override
String getName() {
return color.getColor()+" wallet";
}
}
public class HandBag extends Bag{
public HandBag(Color color) {
super(color);
}
@Override
String getName() {
return color.getColor()+" HandBag";
}
}
4.具体实现化角色
public class Yellow implements Color{
@Override
public String getColor() {
return "yellow";
}
}
public class Red implements Color{
@Override
public String getColor() {
return "red";
}
}
5.测试类
public class Test {
public static void main(String[] args) {
Color c1 = new Yellow();
Color c2 = new Red();
Wallet wallet = new Wallet(c2);
HandBag handBag = new HandBag(c1);
System.out.println(wallet.getName());//red wallet
System.out.println(handBag.getName());//yellow HandBag
}
}
//测试用例不全,包类和颜色类可以任意组合