美文网首页
设计模式学习笔记04-Bridge模式

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

作者: 百恼神烦 | 来源:发表于2018-06-22 19:14 被阅读0次

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

    Bridge(桥接)模式

    基础

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

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

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

    title

    重点介绍下这些组件:

    • Client:使用者
    • Abstraction:抽象类(其实可以直接是实体类),并且使用Implementor进行更高级的操作
    • Implement:定义接口,里面是基础的操作
    • ConcreteImplement:实现Implement中的接口

    例子

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

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

    相关文章

      网友评论

          本文标题:设计模式学习笔记04-Bridge模式

          本文链接:https://www.haomeiwen.com/subject/emzkyftx.html