美文网首页
java设计模式 - 桥接模式

java设计模式 - 桥接模式

作者: CXY_XZL | 来源:发表于2021-04-26 11:43 被阅读0次

    1.简介

    在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。

    当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。

    2.代码

    以汽车为例,汽车按消耗能源分为耗电汽车和耗油汽车,按品牌分为劳斯莱斯和某品牌

    public class BridgeTest {
        public static void main(String[] args) {
            Brand brand = new BrandA();
            Energy energy = new EnergyGasoline();
            Car abs = new RollsRoyce(brand,energy);
            abs.assemble();
            System.out.println("------------------------");
            Brand brandb = new BrandB();
            Energy energye = new EnergyElectric();
             Car car2 = new Lamborghini(brandb,energye);
            car2.assemble();
        }
    }
    //汽车品牌
    interface Brand {
        void OperationImpl();
    }
    
    //品牌具体实现化角色 - 劳斯莱斯
    class BrandA implements Brand {
        public void OperationImpl() {
            System.out.println("汽车品牌是劳斯莱斯");
        }
    }
    //品牌具体实现化角色 - 某品牌
    class BrandB implements Brand {
        public void OperationImpl() {
            System.out.println("汽车品牌是某品牌");
        }
    }
    //汽车消耗的能源
    interface Energy {
        void syImpl();
    }
    //能源具体实现化角色 - 汽油
    class EnergyGasoline implements Energy {
        public void syImpl() {
            System.out.println("汽车消耗能源是汽油");
        }
    }
    //能源具体实现化角色 - 电
    class EnergyElectric implements Energy {
        public void syImpl() {
            System.out.println("汽车消耗能源是电");
        }
    }
    //抽象化角色- 汽车
    abstract class Car {
        protected Brand brand;
        protected Energy energy;
        protected Car(Brand brand,Energy energy) {
            this.brand = brand;
            this.energy = energy;
        }
        public abstract void assemble();
    }
    //汽车扩展抽象化角色 - 劳斯莱斯
    class RollsRoyce extends Car {
        protected RollsRoyce(Brand brand,Energy energy) {
            super(brand,energy);
        }
        public void assemble() {
            System.out.println("劳斯莱斯详情如下:");
            brand.OperationImpl();
            energy.syImpl();
        }
    }
    //汽车扩展抽象化角色 - 某新能源汽车
    class Lamborghini extends Car {
        protected Lamborghini(Brand brand,Energy energy) {
            super(brand,energy);
        }
        public void assemble() {
            System.out.println("新能源汽车详情如下:");
            brand.OperationImpl();
            energy.syImpl();
        }
    }
    

    执行结果如下:

    劳斯莱斯详情如下:
    汽车品牌是劳斯莱斯
    汽车消耗能源是汽油
    ------------------------
    新能源汽车详情如下:
    汽车品牌是某品牌
    汽车消耗能源是电
    

    3.使用方式

    每一个属性类别(品牌,能源,长度,外观颜色···)都是一个接口,而具体属性类别(品牌下的劳斯莱斯、某品牌等)就是一个具体实现类。
    汽车作为一个抽象类,劳斯莱斯和新能源汽车是其具体实现类

    相关文章

      网友评论

          本文标题:java设计模式 - 桥接模式

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