23种设计模式--桥接模式

一、基本概念

桥接模式:
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

为什么不直接使用继承呢?不是可以通过继承来实现多态吗?为什么用组合方式?

二、使用场景

对于只有一个维度的变化,使用继承来实现多态的功能,完全可以满足。
在这里插入图片描述

但对于存在多个维度的使用场景,完全使用继承就会显得代码比较臃肿。

在这里插入图片描述

像上面这种情况,如果使用继承实现的话,需要4 * 3一共12种子类。如果需要新增加一个品牌Oppo的话,需要增加4个子类,代码实现的繁琐程度随着品类的个数成正比。

桥接模式解决了多层继承的结构,处理多维度变化的场景,将各个维度设计成独立的继承结构。使各个维度可以独立的扩展在抽象层建立联系。

三、应用实例

我们使用桥接模式来实现不同的颜色和品牌组合的手机产品。
桥接模式--类图

Brand品牌类实现:

public interface Brand {
    String getBrand();
}

class HuaWei implements Brand {
    @Override
    public String getBrand(){
        return "HuaWei手机";
    }
}

class XiaoMi implements Brand {
    @Override
    public String getBrand(){
        return "XiaoMi手机";
    }
}

class Apple implements Brand {
    @Override
    public String getBrand(){
        return "Apple手机";
    }
}

Color颜色类实现:

public class Color{
    Brand brand;
    String name;

    public Color(Brand brand) {
        this.brand = brand;
    }

    public String getBrand() {
        return brand.getBrand();
    }

    public String getName() {
        return name;
    }
}

class Blue extends Color{

    public Blue(Brand brand) {
        super(brand);
    }

    @Override
    public String getName() {
        return "blue 颜色";
    }
}

class Red extends Color{
    public Red(Brand brand) {
        super(brand);
    }

    @Override
    public String getName() {
        return "red 颜色";
    }
}

class Yellow extends Color{
    public Yellow(Brand brand) {
        super(brand);
    }

    @Override
    public String getName() {
        return "yellow 颜色";
    }
}

class White extends Color{
    public White(Brand brand) {
        super(brand);
    }

    @Override
    public String getName() {
        return "white 颜色";
    }
}

main函数实现:

 public static void main(String[] args) {
        Color blueHuawei = new Blue(new HuaWei());
        System.out.println(blueHuawei.getName() + "__" + blueHuawei.getBrand());
        Color redXiaomi = new Red(new XiaoMi());
        System.out.println(redXiaomi.getName() + "__" + redXiaomi.getBrand());
        Color WhiteApple = new White(new Apple());
        System.out.println(WhiteApple.getName() + "__" + WhiteApple.getBrand());
    }

运行结果如下:
在这里插入图片描述

这样,就可以通过不同的颜色(4个子类)和品牌(3个子类)进行组合,得到自己想要的类的实例,一种只需要实现4 + 3一共7个子类即可。在某一个维度进行拓展时(新增一个品牌或颜色),只需要新增一个对应的子类就可以。

四、拓展思考

此时再增加一个维度,如型号(曲面屏、全面屏、折叠屏),该如何实现?

实现起来也非常方便,可以参考Brand品牌类的实现即可。

参考链接:
http://c.biancheng.net/view/1364.html
https://www.runoob.com/design-pattern/filter-pattern.html
https://www.cnblogs.com/meet/p/5116458.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值