一 问题
1.1 手机操作问题
现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图
image.png
1.2 传统方法对应的类图
image.png现在类型和品牌之间是继承关系
,每多一种款式都要所有的牌子实现各自的子类。
每多一个品牌,也要对所有的类型实现一遍。这样耦合度高
,也容易类爆炸。
二 基本介绍
- 桥接模式(Bridge 模式)是指:将
实现与抽象
放在两个不同的类层次中
,使两个层次可以独立改变
。 (就是本来的父子类,现在要独立开来) - 是一种
结构型
设计模式 - Bridge 模式基于类的
最小设计原则
,通过使用封装、聚合及继承等行为让不同的类承担不同的职责
。它的主要 特点是把抽象(Abstraction)与行为实现(Implementation)分离
开来,从而可以保持各部分的独立性
以及应对他们的功能扩展
2.1 对应的uml类图
image.png桥接模式的角色和职责:
-
Client 调用端
这是Bridge模式的调用者。 -
抽象类(Abstraction)
抽象类接口维护
队行为实现(implementation)的引用
。它的角色就是桥接类
。
3.Refined Abstraction
这是Abstraction的子类。
4.Implementor
行为实现类
接口(Abstraction接口定义了基于Implementor接口的更高层次的操作)
5.ConcreteImplementor
Implementor的子类
三 桥接模式解决手机操作问题
3.1 对应的uml类图
image.png3.2 小结
- 这里本来FolderPhone等等本来适合Vivo等等是父子关系。现在通过Phobe这个桥接器连接在了一起。
- 本质就是2个类之间的继承关系由抽象类关联起来。
3.缺点就是:难度大,需要抽象。并且本人感觉不是所有都适合,可能需要本来的父子类就不是耦合度很高(当然也有可能和抽象水平、理解有关)
3.3 实现
Brand(行为接口)
//接口
public interface Brand {
void open();
void close();
void call();
}
这里都是抽象出来的行为(也和重要)
Phone(桥接器、抽象类)
public abstract class Phone {
//组合品牌
private Brand brand;
//构造器
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
this.brand.open();
}
protected void close() {
brand.close();
}
protected void call() {
brand.call();
}
}
看了一下:里面就是调用上面接口的行为
UpRightPhone(桥接器实现)
public class UpRightPhone extends Phone {
//构造器
public UpRightPhone(Brand brand) {
super(brand);
}
public void open() {
super.open();
System.out.println(" 直立样式手机 ");
}
public void close() {
super.close();
System.out.println(" 直立样式手机 ");
}
public void call() {
super.call();
System.out.println(" 直立样式手机 ");
}
}
重写了自己的逻辑
Vivo(行为实现)
public class Vivo implements Brand {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println(" Vivo手机开机 ");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(" Vivo手机关机 ");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println(" Vivo手机打电话 ");
}
}
3.4 再次小结
- 这样看来,很明显。本来扩展很麻烦。现在首先有两层抽象,这样对客户端是透明的。客户端可以不用改代码就使用最新的扩展实现
- 降低了耦合,也减少了扩展的子类。两边都可以单一扩展
- 由上面可以联想到:改模式比较适用于父子类都可能需要扩展的场景
四 注意事项和细节
- 实现了抽象和实现部分的分离,从而极大的提供了系统的
灵活性
,让抽象部分和实现部分独立开来,这有助于 系统进行分层设计
,从而产生更好的结构化系统。 - 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。 3) 桥接模式替代多层继承方案,可以
减少子类的个数
,降低系统的管理和维护成本。 - 桥接模式的引入
增加了系统的理解和设计难度
,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设 计和编程 - 桥接模式要求
正确识别出系统中两个独立变化的维
度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景
五 常见的应用场景
- JDBC 驱动程序
- 银行转账系统
转账分类: 网上转账,柜台转账,AMT 转账 转账用户类型:普通用户,银卡用户,金卡用户..(两边扩展
) - 消息管理
消息类型
:即时消息,延时消息消息分类
:手机短信,邮件消息,QQ 消息...
网友评论