Swift-桥接模式(Bridge Pattern)

2017-09-25  本文已影响109人  863cda997e42

桥接模式

  1. 桥接模式的目的是把抽象层次结构从其实现中分离出来,使其能够独立变更。
  2. 抽象层定义了供客户端使用的上层的抽象接口。实现层次结构定义了抽象层次使用的底层接口。
  3. 实现类的引用被封装于抽象层的实例中,桥接就形成了。

适用性

  1. 不想在抽象与其实现之间形成固定的绑定关系(这样就能在运行时切换实现)
  2. 抽象及其实现都应可以通过子类化独立进行扩展
  3. 对抽象的实现进行修改不应影响客户端代码
  4. 如果每个实现需要额外的子类以细化抽象,则说明有必要把它们分成两个部分
  5. 想在带有不同抽象接口的多个对象之间共享一个实现

桥接模式的优点:

  1. 桥接模式使用聚合关系,解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化
  2. 提高了系统的可扩展性,可以独立地对抽象部分和实现部分进行扩展
  3. 可减少子类的个数,这个在前面讲手机示例的时候进行分析了
  4. 实现细节对客户透明,可以对用户隐藏实现细节

桥接模式的缺点:

  1. 桥接模式的引入会增加系统的理解与设计难度,由于聚合关系建立在抽象层,要求开发者针对抽象进行设计与编程
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性

Example

protocol Switch {
    var appliance: Appliance {get set}
    func turnOn()
}

protocol Appliance {
    func run()
}

class RemoteControl: Switch {
    var appliance: Appliance

    func turnOn() {
        self.appliance.run()
    }
    
    init(appliance: Appliance) {
        self.appliance = appliance
    }
}

class TV: Appliance {
    func run() {
        print("tv turned on");
    }
}

class VacuumCleaner: Appliance {
    func run() {
        print("vacuum cleaner turned on")
    }
}

var tvRemoteControl = RemoteControl(appliance: TV())
tvRemoteControl.turnOn()

var fancyVacuumCleanerRemoteControl = RemoteControl(appliance: VacuumCleaner())
fancyVacuumCleanerRemoteControl.turnOn()

上一篇 下一篇

猜你喜欢

热点阅读