设计模式之桥接模式

489 阅读3分钟

什么是桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式, 通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合, 从而能在开发时分别使用。 举个例子,例如某个手机厂商生产三个品牌的手机:小米、华为、苹果,每个品牌又分为64G、128G、256G,那么,将会有13个类:

继承.png 随着品牌的增加和存储的增加,类会越来越多,最终“嘣”炸了,也就是常说的“类爆炸”,为了解决“类爆炸”问题,出现了桥接模式:

桥接.png

桥接模式的结构

桥接模式中有四个角色:

  1. 抽象化角色(Abstraction) 主要用来定义角色的行为,同时保存一个对实现化角色的引用,一般为抽象类。
  2. 修正抽象化角色(RefinedAbstraction) 引用实现化角色对抽象化角色进行修正。
  3. 实现化角色(Implementor) 定义角色必须的行为和属性。
  4. 具体实现化角色(ConcreteImplementor) 实现接口或抽象类定义的方法和属性。

一句话表示为:抽象角色引用实现角色,抽象角色的部分实现是由实现角色完成的。

桥接模式的实现

/**
 * 桥接模式
 * 概述:抽象角色引用实现角色,抽象角色的部分实现是由实现角色完成的。
 * 总结:不要过度使用集成,优先进行聚合,降低耦合度。
 */
public class Bridge {
    public static void main(String[] args) {
        Phone phone = new HuaWeiPhone(new Memory64());
        phone.info();
        phone = new XiaoMiPhone(new Memory128());
        phone.info();
        phone = new ApplePhone(new Memory256());
        phone.info();
    }
}

abstract class Phone {
    Memory memory;

    public Phone(Memory memory) {
        this.memory = memory;
    }

    abstract void info();
}

interface Memory {
    String getMemeory();
}

class XiaoMiPhone extends Phone {

    public XiaoMiPhone(Memory memory) {
        super(memory);
    }

    @Override
    void info() {
        System.out.println("当前手机品牌为小米,内存" + this.memory.getMemeory());
    }
}

class HuaWeiPhone extends Phone{

    public HuaWeiPhone(Memory memory) {
        super(memory);
    }

    @Override
    void info() {
        System.out.println("当前手机品牌为华为,内存" + this.memory.getMemeory());
    }
}
class ApplePhone extends Phone{

    public ApplePhone(Memory memory) {
        super(memory);
    }

    @Override
    void info() {
        System.out.println("当前手机品牌为苹果,内存" + this.memory.getMemeory());
    }
}


class Memory64 implements Memory {

    @Override
    public String getMemeory() {
        return "64G";
    }
}
class Memory128 implements Memory {

    @Override
    public String getMemeory() {
        return "128G";
    }
}
class Memory256 implements Memory {

    @Override
    public String getMemeory() {
        return "256G";
    }
}

通过实现可以看出来,类的数量明显少了,好处在于增加品牌只需要Phone派生子类,增加内存只需要Memory派生子类,可以随意组合,即不同品牌的手机可以和不同的内存进行组合。

桥接模式的优缺点

桥接模式的优点

  1. 符合单一职责原则、开闭原则。
  2. 抽象和实现分离,抽象和实现单独控制,互不影响。
  3. 提高系统的可拓展性。

桥接模式的缺点

1.增加了系统的设计和理解难度。

桥接模式的使用场景

  1. 多维度扩展类时可以使用桥接模式。
  2. 不希望使用继承导致类爆炸可以使用桥接模式。

总结

桥接模式用聚合的方式代替继承,降低抽象与具体的耦合,重点在于“解耦”,一句话总结:双重维度扩展。 桥接模式和组合模式的区别:组合模式侧重于整体与部分,桥接模式侧重于同级别类。