不管怎么样,都要继续充满着希望
上一章简单介绍了适配器模式(九), 如果没有看过, 请观看上一章
一. 桥接模式
引用 菜鸟教程里面的 桥接模式介绍: https://www.runoob.com/design-pattern/bridge-pattern.html
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,
它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响
一.一 介绍
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。
如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
关键代码:抽象类依赖实现类。
应用实例:
1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。
2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。
- JDBC 驱动程序
- 银行转账系统 (有分类和用户类型)
- 消息管理 (有消息类型,即时/延时, 有消息的分类,手机,邮箱等)
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
如手机的品牌 和手机打开的方式 ( 上,下)是不同的信息。
注意,用大的范围在外面, 引用小的范围。
组成角色 | 具体 | 关系 | 作用 |
---|---|---|---|
Implementor | Brand | 行为实现类的接口 | 行为实现类的接口 |
ConcreteImplementorA /B | HuaWeiBrand,XiaoMiBrand | 行为的具体实现类 | 行为的具体实现类 |
抽象类(Abstraction) | Phone | 维护行为 | 维护行为 |
RefinedAbstraction | UpPhone,DownPhone | 是 Abstraction 抽象类的子类 | 是 Abstraction 抽象类的子类 |
二. 桥接应用
二.一 品牌接口
public interface Brand {
void sendMessage();
void open();
void close();
void call();
}
二.二 品牌实现
@Slf4j
public class HuaWeiBrand implements Brand{
@Override
public void sendMessage() {
log.info("华为手机实现发送短信功能");
}
@Override
public void open() {
log.info("华为手机实现发送开机");
}
@Override
public void close() {
log.info("华为手机实现关机");
}
@Override
public void call() {
log.info("华为手机实现打电话");
}
}
@Slf4j
public class XiaoMiBrand implements Brand{
@Override
public void sendMessage() {
log.info("小米手机实现发送短信功能");
}
@Override
public void open() {
log.info("小米手机实现发送开机");
}
@Override
public void close() {
log.info("小米手机实现关机");
}
@Override
public void call() {
log.info("小米手机实现打电话");
}
}
二.三 手机 Phone
依赖 Brand
public abstract class Phone {
private Brand brand ;
public Phone (Brand brand) {
this.brand = brand;
}
public void sendMessage() {
brand.sendMessage();
}
public void open() {
brand.open();
}
public void close() {
brand.close();
}
public void call() {
brand.call();
}
}
二.四 抽象类实现
public class UpPhone extends Phone{
public UpPhone(Brand brand) {
super(brand);
}
@Override
public void sendMessage() {
super.sendMessage();
}
@Override
public void open() {
super.open();
}
@Override
public void close() {
super.close();
}
@Override
public void call() {
super.call();
}
}
public class DownPhone extends Phone{
public DownPhone(Brand brand) {
super(brand);
}
@Override
public void sendMessage() {
super.sendMessage();
}
@Override
public void open() {
super.open();
}
@Override
public void close() {
super.close();
}
@Override
public void call() {
super.call();
}
}
二.五 测试调用
@Test
public void oneTest() {
Phone phone = new UpPhone(new XiaoMiBrand());
phone.open();
phone.close();
phone = new DownPhone(new XiaoMiBrand());
phone.sendMessage();
phone.call();
}
桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
本章节的代码放置在 github 上:
https://github.com/yuejianli/DesignPattern/tree/develop/Bridge
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!