设计模式学习笔记04-Bridge模式

2018-06-22  本文已影响0人  百恼神烦

本文主要是看了《设计模式》做的笔记和思考,在此分享仅代表个人观点,如有不对的地方欢迎批评和指正。

Bridge(桥接)模式

基础

该模式着重解决的问题,是将整体中某个可能多变的部分抽象并分离,使得需求改变时仅需改变抽象部分即可,改变后,使用方式不变。

Adapter模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。然而,Bridge模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。 ——《设计模式》

博客园一博主的图片一用:

title

重点介绍下这些组件:

例子

拿钢铁侠的反应炉举例吧,钢铁侠和他胸口的反应炉的关系应该如下:

public class IronMan {
    private ArcReactor reactor;
    private double health = 100; //假设其为100,降到0就中毒
    
    public void setReactor(ArcReactor reactor) {
        this.reactor = reactor;
    }
    
    public void use() {
        double energy = reactor.getEnergy();
        // do something
        System.out.println("使用钢铁侠套装");
        health = reactor.solveScrap(health);
    }
    
    public double checkPd() {
        String s = "当前血液中钯浓度为"+(100-health)+"%,";
        String result = "";
        if(health < 0) {
            result = "已中毒过深";
        }else if (health == 100) {
            result = "健康";
        }else {
            result = "请尽快处理";
        }
        System.out.println(s+result);
        return health;
    }
    
    public void reset() {
        health = 100;
    }
}

public interface ArcReactor {
    public double getEnergy();
    // 处理废料
    public double solveScrap(double body);
}

然后Tony创造了两种:微型方舟反应炉,新元素方舟反应炉。

/**
 * 微型化的方舟反应炉
 * @author Will
 */
public class MicroReactor implements ArcReactor {
    private double palladium = 100; //钯元素
    private double scrap = 0;
    
    @Override
    public double getEnergy() {
        palladium--;
        return 30;
    }

    @Override
    public double solveScrap(double body) {
        // 废料直接排出
        scrap++;
        body-=11;
        return body;
    }
}


public class NewElementReactor implements ArcReactor {
    private double newElement = 100; //新元素
    @Override
    public double getEnergy() {
        newElement--;
        return 30;
    }

    @Override
    public double solveScrap(double body) {
        // 清洁能源无污染
        return body;
    }
}

使用如下:


public class Main {
    public static void main(String[] args) {
        IronMan tony = new IronMan();
        MicroReactor oldReactor = new MicroReactor();
        tony.setReactor(oldReactor);
        
        tony.use();
        tony.checkPd();
        
        tony.reset();
        System.out.println("\n换个反应炉再来\n");
        
        NewElementReactor newReactor = new NewElementReactor();
        tony.setReactor(newReactor);
        tony.use();
        tony.checkPd();
    }
}

结果如下:

使用钢铁侠套装
当前血液中钯浓度为11.0%,请尽快处理

换个反应炉再来

使用钢铁侠套装
当前血液中钯浓度为0.0%,健康

更换反应炉并不影响整个使用过程,而且,IronMan这个类的子类可以继续使用。

总结

Bridge模式重点在于将容易变更的部分抽象出来,抽象部分的改动不影响整体的其他代码,而且整体的子类能以相同的方式使用抽象部分,让代码更加灵活。

上一篇下一篇

猜你喜欢

热点阅读