设计模式——桥接模式
来源:互联网 发布:js radio 美化样式 编辑:程序博客网 时间:2024/06/06 12:58
概念:将首相部分与它的实现部分分离,使它们都可以独立地变化
个人理解:
1. 某个对象有多角度分类,每一种分类可能有多种变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合
2. 桥接模式就是依据合成/聚合复用的设计原则替代面向对象设计中的"继承",或减少对象继承的层次
3. 聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样,如图所示大雁——雁群为聚合关系,大雁——翅膀为合成关系
4. 合成/聚合复用原则的好处:优先使用对象的合成/聚合将有助于包吃每个类被封装,并被集中在单个任务上;这样类和继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
5. 桥接模式UML图:
6. 示例代码:
Impementor:
public abstract class Software { protected String name; public Software(String name) { this.name = name; } public String getName() { return name; } abstract void run();}
ConcreteImplementerA:
public class Camera extends Software { public Camera(String name) { super(name); } @Override public void run() { Log.i("Camera","---------运行:" + name + "---------"); }}
ConcreteImplementerB:
public class MailList extends Software { public MailList(String name) { super(name); } @Override public void run() { Log.i("MailList","---------运行:" + name + "---------"); }}
Abstraction:
public abstract class BridgePhone { protected List<Software> softwares; public BridgePhone(List<Software> softwares) { this.softwares = softwares; } public void addSoftWare(Software software){ for (Software soft : softwares){ if (soft.getName().equals(software.getName())){ Log.i("BridgeIphone","--------已经安装了:" + software.getName()+ "---------"); return; } } softwares.add(software); Log.i("BridgeIphone","---------安装软件:" + software.getName()+ "---------"); } public void runSoftware(String name){ for (Software software : softwares){ if (software.getName().equals(name)){ software.run(); } } }}
RefinedAbstraction:
public class BridgeIphone extends BridgePhone { public BridgeIphone(List<Software> softwares) { super(softwares); } @Override public void addSoftWare(Software software) { Log.i("BridgeIphone","---------BridgeIphone---------"); super.addSoftWare(software); } @Override public void runSoftware(String name) { Log.i("BridgeIphone","---------BridgeIphone---------"); super.runSoftware(name); }}
RefinedAbstraction:
public class BridgeAndroidPhone extends BridgePhone { public BridgeAndroidPhone(List<Software> softwares) { super(softwares); } @Override public void addSoftWare(Software software) { Log.i("BridgeAndroidPhone","---------BridgeAndroidPhone---------"); super.addSoftWare(software); } @Override public void runSoftware(String name) { Log.i("BridgeAndroidPhone","---------BridgeAndroidPhone---------"); super.runSoftware(name); }}
客户端调用:
private void factoryBridge(){ Software camera = new Camera(Constants.SOFTWARE_CAMERA); Software mailList = new MailList(Constants.SOFTWARE_MAIL_LIST); List softwareList = new ArrayList(); BridgePhone iPhone = new BridgeIphone(softwareList); iPhone.addSoftWare(camera); iPhone.runSoftware(Constants.SOFTWARE_CAMERA); iPhone.addSoftWare(mailList); iPhone.runSoftware(Constants.SOFTWARE_MAIL_LIST); softwareList.clear(); softwareList.add(camera); softwareList.add(mailList); BridgePhone androidPhone = new BridgeAndroidPhone(softwareList); androidPhone.runSoftware(Constants.SOFTWARE_CAMERA); androidPhone.runSoftware(Constants.SOFTWARE_MAIL_LIST);}
运行结果:
12-05 16:43:49.247 15673-15673/com.wdp.designtest I/BridgeIphone: ---------安装软件:CAMERA---------
12-05 16:43:49.247 15673-15673/com.wdp.designtest I/BridgeIphone: ---------BridgeIphone---------
12-05 16:43:49.247 15673-15673/com.wdp.designtest I/Camera: ---------运行:CAMERA---------
12-05 16:43:49.247 15673-15673/com.wdp.designtest I/BridgeIphone: ---------BridgeIphone---------
12-05 16:43:49.247 15673-15673/com.wdp.designtest I/BridgeIphone: ---------安装软件:MAILLIST---------
12-05 16:43:49.247 15673-15673/com.wdp.designtest I/BridgeIphone: ---------BridgeIphone---------
12-05 16:43:49.248 15673-15673/com.wdp.designtest I/MailList: ---------运行:MAILLIST---------
12-05 16:43:49.248 15673-15673/com.wdp.designtest I/BridgeAndroidPhone: ---------BridgeAndroidPhone---------
12-05 16:43:49.248 15673-15673/com.wdp.designtest I/Camera: ---------运行:CAMERA---------
12-05 16:43:49.248 15673-15673/com.wdp.designtest I/BridgeAndroidPhone: ---------BridgeAndroidPhone---------
12-05 16:43:49.248 15673-15673/com.wdp.designtest I/MailList: ---------运行:MAILLIST---------
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 【设计模式】——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- 设计模式——桥接模式
- java 23种设计模式
- 从FAT16开始认识文件系统《专栏:寻找我的.doc》
- vue watch监听对象及对应值的变化
- mybatis插入记录后获得主键id
- mysql自增
- 设计模式——桥接模式
- Pandas DataFrames筛选数据
- 树链剖分 代码小记
- Centos7.3+Jenkins+Git+Maven 自动化构建部署项目(一)
- windows下,tomcat 9.0配置虚拟路径,此方法适配7.0,8.0
- linux 下 防火墙造成的tomcat无法远程访问
- 在学习C语言时遇到的一些细节方面的问题
- svn提交时不显示文件的问题
- 谷歌浏览器跨域问题解决