桥接模式
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现两个可变维度的耦合性,桥接吗模式包含以下主要角色
- 抽象化角色:定义抽象类,并包含一个对实现化对象的引用
- 扩展抽象化角色:抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
- 实现化角色:定义实现化角色接口,供扩展抽象化角色调用
- 具体实现化角色:给出实现化角色接口的具体实现
【案例】
现对不同手机类型的不同品牌实现看电影、玩游戏、打电话功能
传统方式解决手机问题的类图 使用桥接模式后的类图
public class BridgeTest {
public static void main(String[] args) {
Phone phone = new FoldedPhone(new HUAWEI());
phone.playGame();
phone.watchTV();
phone.call();
Phone phone1 = new DirectPhone(new XIAOMI());
phone1.playGame();
phone1.watchTV();
phone1.call();
}
}
interface Brand{
void watchTV();
void playGame();
void call();
}
class XIAOMI implements Brand{
public void watchTV() {System.out.println("小米手机看电视");}
public void playGame() {System.out.println("小米手机打游戏");}
public void call() {System.out.println("小米手机打电话");}
}
class HUAWEI implements Brand{
public void watchTV() {System.out.println("华为手机看电视");}
public void playGame() {System.out.println("华为手机打游戏");}
public void call() {System.out.println("华为手机打电话");}
}
abstract class Phone{
private Brand brand;
public Phone(Brand brand) {this.brand = brand;}
protected void watchTV(){brand.watchTV();}
protected void playGame(){brand.playGame();}
protected void call(){brand.call();}
}
class FoldedPhone extends Phone{
public FoldedPhone(Brand brand) {
super(brand);
}
public void watchTV() {
super.watchTV();
System.out.println("折叠屏样式手机");
}
public void playGame() {
super.playGame();
System.out.println("折叠屏样式手机");
}
public void call() {
super.call();
System.out.println("折叠屏样式手机");
}
}
class DirectPhone extends Phone{
public DirectPhone(Brand brand) {
super(brand);
}
public void watchTV() {
super.watchTV();
System.out.println("直屏样式手机");
}
public void playGame() {
super.playGame();
System.out.println("直屏样式手机");
}
public void call() {
super.call();
System.out.println("直屏样式手机");
}
}
桥接模式的优缺点
- 优点
1、分离抽象接口及其实现部分,从而极大的增加了系统的灵活性 2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统 3、实现细节对客户透明,可以对用户隐藏实现细节 4、减少了子类的个数,降低了管理和维护成本 - 缺点
1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
适用场景
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
|