美文网首页
设计模式——桥接模式

设计模式——桥接模式

作者: 笑对浮华 | 来源:发表于2023-09-25 11:33 被阅读0次

    一、介绍

    当系统中存在多个维度的变量相互依赖,且又要能独立的变化、拓展,传统多级继承方案会出现类爆炸的情况,且子类代码高度相似,当一级子类需要拓展时,相应的二级子类都需要做出修改,不符合类得单一职责原则,因为二级子类继承了一级子类,同时兼具了一级和二级功能。处理这种由于系统多级继承导致的类急剧增加问题,桥接模式尤为适用。桥接模式将不同维度的变量抽象出来,放在不同的类层次中,使它们互相独立,独自负责各自的功能拓展,再通过组合这种相比继承要低耦合的关联方式将不同维度的变量结合在一起。

    二、模式

    1、传统模式UML

    传统多层继承

    传统模式中,当Computer品牌再增加一个,那么相应的二级处理器类需要增加两个,如果再多一级显卡驱动(集显、独显),那么整个系统的类数量将呈指数级增加,出现类爆炸的情况,而且当一级子类修改功能时,二级子类也需要修改,对于二级子类来说不符合单一职责原则。

    2、桥接模式UML

    桥接模式

    CPU从Computer中分离出来,分处两个不同的层级,CPU以组合的方式集成到Conputer中,这样当CPU或者Computer需要拓展时,都不需要关注对象的情况,而且也不会出现类爆炸的情况。

    三、代码实例

    public abstract class Computer {
    
        public Computer(CPU cpu) {
        }
    
        protected abstract void  run();
    }
    
    public interface CPU {
    
        String structure();
    }
    
    public class Asus extends Computer{
    
        private CPU mCpu;
    
        public Asus(CPU cpu) {
            super(cpu);
            mCpu = cpu;
        }
    
        public void setCpu(CPU cpu){
            mCpu = cpu;
        }
    
        @Override
        protected void run() {
            System.out.println("华硕电脑搭载"+mCpu.structure());
        }
    }
    
    public class CoreI3 implements CPU{
    
        @Override
        public String structure() {
            return "酷睿i3处理器";
        }
    }
    
    public class Main {
    
        public static void main(String[] args){
            Asus asus = new Asus(new CoreI3());
            asus.run();
            asus.setCpu(new CoreI5());
            asus.run();
            System.out.println("****************");
            Lenovo lenovo = new Lenovo(new CoreI3());
            lenovo.run();
            lenovo.setCpu(new CoreI5());
            lenovo.run();
        }
    }
    
    运行结果

    四、总结

    桥接模式抽象了相互依赖的模块,分离抽象和实现,模块之间以组合的方式关联起来,对于高层来说,只关心抽象部分,具体业务细节由子类去实现,解决了多层继承方案带来的类爆炸问题和不符合单一职责原则问题,使得系统便于拓展、易维护。

    相关文章

      网友评论

          本文标题:设计模式——桥接模式

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