写在前面
- 记录学习设计模式的笔记
- 提高对设计模式的灵活运用
学习地址
https://www.bilibili.com/video/BV1G4411c7N4
https://www.bilibili.com/video/BV1Np4y1z7BU
参考文章
http://c.biancheng.net/view/1317.html
项目源码
https://gitee.com/zhuang-kang/DesignPattern
11,桥接模式
11.1 桥接模式的定义和特点
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
通过上面的讲解,我们能很好的感觉到桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。
桥接(Bridge)模式的优点是:
- 抽象与实现分离,扩展能力强
- 符合开闭原则
- 符合合成复用原则
- 其实现细节对客户透明
缺点是:
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
11.2 桥接模式的结构与实现
11.2.1 桥接模式的结构
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
11.2.2 代码实现
Brand 抽象化角色
package com.zhuang.bridge;
/**
* @Classname Brand
* @Description 品牌类
* @Date 2021/3/22 9:31
* @Created by dell
*/
public interface Brand {
void open();
void call();
void close();
}
Vivo 拓展抽象化角色
package com.zhuang.bridge;
/**
* @Classname Vivo
* @Description 手机品牌 实现品牌接口
* @Date 2021/3/22 9:30
* @Created by dell
*/
public class Vivo implements Brand {
@Override
public void open() {
System.out.println("Vivo手机开机");
}
@Override
public void call() {
System.out.println("Vivo手机打电话");
}
@Override
public void close() {
System.out.println("Vivo手机关机");
}
}
XiaoMi 拓展抽象化角色
package com.zhuang.bridge;
/**
* @Classname XiaoMi
* @Description 手机品牌 实现品牌接口
* @Date 2021/3/22 9:30
* @Created by dell
*/
public class XiaoMi implements Brand {
@Override
public void open() {
System.out.println("XiaoMi手机开机");
}
@Override
public void call() {
System.out.println("XiaoMi手机打电话");
}
@Override
public void close() {
System.out.println("XiaoMi手机关机");
}
}
Phone
package com.zhuang.bridge;
/**
* @Classname Phone
* @Description 手机类 抽象类
* @Date 2021/3/22 9:30
* @Created by dell
*/
public abstract class Phone {
//组合品牌
private Brand brand;
//构造器
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
this.brand.open();
}
protected void close() {
this.brand.close();
}
protected void call() {
this.brand.call();
}
}
FoldedPhone
package com.zhuang.bridge;
/**
* @Classname FoldedPhone
* @Description 折叠手机类
* @Date 2021/3/22 9:31
* @Created by dell
*/
public class FoldedPhone extends Phone {
//构造器
public FoldedPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("折叠手机样式");
}
@Override
public void call() {
super.call();
System.out.println("折叠手机样式");
}
@Override
public void close() {
super.close();
System.out.println("折叠手机样式");
}
}
UpRightPhone
package com.zhuang.bridge;
/**
* @Classname UpRightPhone
* @Description 直立手机类
* @Date 2021/3/22 9:33
* @Created by dell
*/
public class UpRightPhone extends Phone {
//构造器
public UpRightPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("直立手机样式");
}
@Override
public void call() {
super.call();
System.out.println("直立手机样式");
}
@Override
public void close() {
super.close();
System.out.println("直立手机样式");
}
}
Client
package com.zhuang.bridge;
/**
* @Classname Client
* @Description 客户端类
* @Date 2021/3/22 9:30
* @Created by dell
*/
public class Client {
public static void main(String[] args) {
Phone phone1 = new FoldedPhone(new XiaoMi());
phone1.open();
phone1.call();
phone1.close();
System.out.println("==============================");
Phone phone2 = new UpRightPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
}
}
11.3 桥接模式的应用场景
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
写在最后
- 如果我的文章对你有用,请给我点个👍,感谢你😊!
- 有问题,欢迎在评论区指出!💪