目录
前言
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。如果用桥接模式就能很好地解决这些问题
定义
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
优点与缺点
优点
- 抽象与实现分离,扩展能力强
缺点
- 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
桥接模式的结构与实现
模式的结构
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现
结构图
应用实例
需求
分析:女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。
代码
abstraction
Bag
/**
*
* 抽象化角色
*
* @author hanchao
* @version 1.0
* @date 2022/4/28 16:59
*/
public abstract class Bag {
public Color color;
public void setColor(Color color){
this.color = color;
}
public abstract void getName();
}
concreteImplementor
HandBag
/**
*
* 扩展抽象化角色
*
* @author hanchao
* @version 1.0
* @date 2022/4/28 17:01
*/
public class HandBag extends Bag {
@Override
public void getName() {
System.out.println(color.showColor() + "HandBag");
}
}
Wallet
/**
*
* 扩展抽象化角色
*
* @author hanchao
* @version 1.0
* @date 2022/4/28 17:03
*/
public class Wallet extends Bag {
@Override
public void getName() {
System.out.println(color.showColor() + "wallet");
}
}
implementor
Color
/**
*
* 实现化角色
*
* @author hanchao
* @version 1.0
* @date 2022/4/28 16:54
*/
public interface Color {
String showColor();
}
refinedAbstraction
Blue
/**
*
* 具体实现化角色
*
* @author hanchao
* @version 1.0
* @date 2022/4/28 16:57
*/
public class Blue implements Color {
@Override
public String showColor() {
return "蓝色";
}
}
Red
/**
*
* 具体实现化角色
*
* @author hanchao
* @version 1.0
* @date 2022/4/28 16:55
*/
public class Red implements Color {
@Override
public String showColor() {
return "红色";
}
}
client
client
/**
* @author hanchao
* @version 1.0
* @date 2022/4/28 17:04
*/
public class Client {
public static void main(String[] args) {
Color color = new Blue();
Bag bag = new Wallet();
bag.setColor(color);
bag.getName();
}
}