写在后面
- 记录学习设计模式的笔记
- 进步对设计模式的灵活运用
学习地址
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 桥接模式的利用场景
当一个类外部具备两种或多种变动维度时,应用桥接模式能够解耦这些变动的维度,使高层代码架构稳固。
- 当一个类存在两个独立变动的维度,且这两个维度都须要进行扩大时。
- 当一个零碎不心愿应用继承或因为多层次继承导致系统类的个数急剧减少时。
- 当一个零碎须要在构件的抽象化角色和具体化角色之间减少更多的灵活性时。
写在最初
- 如果我的文章对你有用,请给我点个👍,感激你😊!
- 有问题,欢送在评论区指出!💪