设计模式——桥接模式

来源:互联网 发布: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---------

原创粉丝点击