一、需求,针对不同手机类型,不同品牌实现操编码(如打开,电话,关闭等):
传统编码:
传统方案分析:
1)扩展性问题(类爆炸),如果增加手机样式,比如翻盖式,就需要增加各个品牌手机的类,当增加一个品牌,如vivo,也要再各个手机样式类下添加。
2)违法了单一职责原则,当增加手机样式时,要同时增加所有品牌的手机,增加了代码维护成本。
3)解决方案——采用桥接模式。
二、桥接模式-基本介绍
1)桥接模式:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
2)是一种结构型设计模式。
3)Bridge模式基于类的最小设计原则,通过封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及对他么的功能扩展。
三、原理类图:
类图说明:
1)抽象类(Abstraction):维护了Implementor/即它的实现类ConcreteImplementA/B,二者是聚合关系,Abstraction充当桥梁类。
2)RefinedAbstraction:是Abstraction抽象类的子类
3)Implementor:行为实现类的接口
4)ConcreteImplementA/B:行为的具体实现类
5)从UML图:这里的抽象类和接口是聚合的关系,其实调用和被调用关系。
四、采用桥接模式解决需求
1、UML图
2、简要代码
1)代码结构
2)简要代码
package com.it.bridge.improve; public class Client { public static void main(String[] args) { Brand huawei = new Huawei(); Phone phone1 = new FlipPhone(huawei); phone1.open(); phone1.call(); phone1.close(); System.out.println("=========="); Phone phone2 = new UprightPhone(huawei); phone2.open(); phone2.call(); phone2.close(); System.out.println("=========="); Brand xiaomi = new Xiaomi(); Phone phone3 = new FlipPhone(xiaomi); phone3.open(); phone3.call(); phone3.close(); System.out.println("=========="); Phone phone4 = new UprightPhone(xiaomi); phone4.open(); phone4.call(); phone4.close(); } }
五、桥接模式注意事项和细节:
1)实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
2)对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其他的部分由具体业务来完成。
3)桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
4)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立再抽象层,要求开发者针对抽象进行设计和编程。
5)桥接模式要求正确识别出系统中两个独立变化的维度(抽象、实现),因此其使用范围由一定的局限性,即需要有这样的应用场景。
六、桥接模式其他应用场景
1)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统。
2)常见的应用场景:
- JDBC驱动程序;
- 银行转账系统
①转账分类:网上转账,柜台转账,AMT转账;--抽象
②转账用户类型:普通用户,银卡用户,金卡用户;--实现
- 消息管理
①消息类型:即时消息,延迟消息;--抽象
②消息分类:手机短信,邮件消息,QQ消息;--实现