目录
- 1. 说明
- 2. 应用场景
- 3. 结构图
- 4. 构成
- 5. 适用性
- 6. 优点
- 7. 缺点
- 8. java示例
1. 说明
- 1.将抽象部分与其实现部分分离,使它们都可以独立地变化。
- 2.桥接模式(Bridge Pattern)属于对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
2. 应用场景
- 1.图形界面库:图形界面库提供了一组通用的界面元素(如按钮、文本框、下拉菜单等),同时也提供了多种不同的绘制方式(如窗口系统的绘制、OpenGL的绘制等)。通过使用桥接模式,可以将界面元素和绘制方式解耦,使得它们可以独立地变化。
- 2.电子商务平台:在电子商务平台中,商品和展示方式可以看作是两个独立变化的维度。桥接模式可以将它们进行解耦,使得商品和展示方式可以独立变化。
- 3.操作系统的文件系统:文件系统可以支持多种存储介质(如磁盘、光盘、网络存储等),同时也可以支持多种文件系统类型(如FAT32、NTFS、EXT4等)。桥接模式可以将存储介质和文件系统类型进行解耦,使得它们可以独立变化。
- 4.游戏开发中的人物角色:在游戏开发中,人物角色通常具有多种不同的属性和技能(如力量、敏捷、法力等)。这些属性和技能可以看作是两个独立变化的维度。桥接模式可以将它们进行解耦,使得人物角色的属性和技能可以独立变化。
3. 结构图
4. 构成
- 1.Abstraction(抽象化角色):定义抽象类的接口,并包含一个对实现化对象的引用。
- 2.RefinedAbstraction(扩展抽象化角色):扩充由Abstraction定义的接口。是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 3.Implementor(实现化角色):定义实现类接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
- 4.ConcreteImplementor实现Implementor接口并定义它的具体实现。
5. 适用性
- 1.不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
- 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是 Bridge 模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充
- 3.对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
- 4.(C++)想对客户完全隐藏抽象的实现部分
- 5.有许多类要生成的类层次结构。
- 6.想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
6. 优点
-
1.分离抽象接口及其实现部分:桥接模式允许将抽象与实现解耦,使得抽象和实现可以独立地变化。这有助于降低系统的耦合性,提高系统的灵活性和可扩展性。
-
2.提高可重用性:由于抽象和实现之间的分离,桥接模式可以提高代码的可重用性。例如,当需要实现不同的具体实现时,只需要更改实现部分,而无需修改抽象部分。
-
3.支持动态组合:桥接模式使用对象间的组合关系替代了继承关系,使得系统可以更加灵活地进行动态组合。这有助于降低系统的复杂性,提高系统的可维护性。
7. 缺点
- 1.增加系统的理解与设计难度:由于桥接模式需要在抽象层进行设计和编程,这可能会增加系统的理解与设计难度。开发者需要一开始就针对抽象层进行设计与编程,这需要一定的技术水平和经验。
- 2.识别独立变化的维度:在系统中正确识别出两个独立变化的维度并不是一件容易的事情。这需要对系统有深入的理解和分析,才能准确地找到这两个维度。
- 3.可能导致类的数量增加:桥接模式将抽象部分与实现部分分离,这可能会导致系统中类的数量增加。这可能会增加系统的复杂性,需要更加仔细地设计和管理代码。
8. java示例
- 1.衣服抽象类Abstraction
package com.learning.bridge;
/**
* 衣服抽象类
*/
public abstract class Clothing {
// 桥接的部分,通过Color接口与实现部分连接
protected Color color;
public Clothing(Color color) {
this.color = color;
}
public abstract void showColor();
}
- 2.衬衫类RefinedAbstraction
package com.learning.bridge;
/**
* 衬衫
*/
public class Shirt extends Clothing {
// 桥接的部分,通过Color接口与实现部分连接
public Shirt(Color color) {
super(color);
}
@Override
public void showColor() {
System.out.println("The shirt is " + color.getColorName() + ".");
}
}
- 3.颜色类Implementor
package com.learning.bridge;
/**
* 颜色接口
*/
public interface Color {
// 获取颜色
String getColorName();
}
- 4.红色类ConcreteImplementor
package com.learning.bridge;
/**
* 红色
*/
public class RedColor implements Color {
@Override
public String getColorName() {
return "red";
}
}
- 5.蓝色类ConcreteImplementor
package com.learning.bridge;
/**
* 蓝色
*/
public class BlueColor implements Color {
@Override
public String getColorName() {
return "blue";
}
}
- 8.客户端
package com.learning.bridge;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 创建一个红色的衬衫
Clothing redShirt = new Shirt(new RedColor());
redShirt.showColor();
// 创建一个蓝色的衬衫(不需要修改Shirt类的代码)
Clothing blueShirt = new Shirt(new BlueColor());
blueShirt.showColor();
}
}
- 7.示例截图