一、桥接模式介绍
基本介绍
1)桥接模式是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变;
2)是一种结构型设计模式;
3)Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
桥接模式原理类图
原理类图说明:
1)Client类:桥接模式的调用者;
2)抽象类(Abstraction):维护Implementor/即它的实现类ConcreteImplementorA…,二者是聚合关系,Abstraction充当桥接类;
3)RefinedAbstraction:是Abstraction抽象类的子类;
4)Implementor:行为实现类的接口;
5)ConcreteImplementorA/B:行为的具体实现类;
6)从UML图:这里的抽象类和接口是聚合的关系,其实调用和被调用关系。
桥接模式注意事项和细节
1)实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统;
2)对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其他的部分由具体业务来完成;
3)桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本;
4)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象层进行设计和编程;
5)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。
桥接模式其他应用场景
1)对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为使用;
2)常见的应用场景:
- JDBC驱动程序
- 银行转账系统
转账分类:网上转账,柜台转账,ATM转账(抽象层)
转账用户类型:普通用户,银卡用户,金卡用户等(实现层) - 消息管理
消息类型:即时消息,延时消息等(抽象层)
消息分类:手机短信,邮件消息,QQ消息等(实现层)
二、应用
- 桥接模式应用实例
假设有不同品牌的手机,而且都有打电话、开机关机的功能,而每个品牌下的手机都有各种样式型号的手机。实现增加某一个品牌或者增加某一个样式的手机时,只需增加少量的类。如下图传统的方案,每新增一个品牌的手机或者新增一个样式的手机,都要新增好几个类。
- 类图
- 代码
1)品牌接口类
//接口
public interface Brand {
public void open();
public void close();
public void call();
}
2)具体品牌子类
public class Vivo implements Brand{
public void open() {
System.out.println("Vivo手机开机");
}
public void close() {
System.out.println("Vivo手机关机");
}
public void call() {
System.out.println("Vivo手机打电话");
}
}
public class XiaoMi implements Brand{
public void open() {
System.out.println("小米手机开机");
}
public void close() {
System.out.println("小米手机关机");
}
public void call() {
System.out.println("小米手机打电话");
}
}
3)抽象样式手机类
public abstract class Phone {
//组合品牌
private Brand brand;
//构造器
public Phone(Brand brand) {
this.brand = brand;
}
protected void open(){
this.brand.open();
}
protected void close(){
this.brand.close();
}
protected void call(){
this.brand.call();
}
}
4)具体样式手机类
//折叠式手机类,继承抽象类Phone
public class FoldedPhone extends Phone{
//构造器
public FoldedPhone(Brand brand) {
super(brand);
}
public void open(){
super.open();
System.out.println("折叠样式手机");
}
public void close(){
super.close();
System.out.println("折叠样式手机");
}
public void call(){
super.close();
System.out.println("折叠样式手机");
}
}
//旋转式手机类,继承抽象类Phone
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.close();
System.out.println("直立样式手机");
}
}
5)客户端类’
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 FoldedPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
System.out.println("===============");
Phone phone3 = new UpRightPhone(new Vivo());
phone3.open();
phone3.call();
phone3.close();
}
}