设计模式——桥接模式

概念:将首相部分与它的实现部分分离,使它们都可以独立地变化

个人理解:

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---------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值