浅谈设计模式之桥接模式

来源:互联网 发布:网络堵塞怎么解决方法 编辑:程序博客网 时间:2024/05/17 01:00

桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。要理解抽象与它的实现分离,这并不是说让抽象类与它的派生类分离,这并没有什么意义。实现指的是每个类继承体系都各自用来实现自己的对象,对于多个维度的变化各不影响。

比如,我们日常中都会使用各种品牌的手机,而每个品牌的预装软件都不尽相同。假如我们要设计各种各样的包括软硬件的手机的话,那就不可避免同时拥有各种品牌和软件,这时候无论以软件或者品牌作为父类都不合适,最恰当的方式是品牌中包含手机软件。这个就涉及到了组合/聚合的使用。

根据组合/聚合复用原则,程序中药尽量使用组合/聚合,尽量不要使用类的继承,以免系统组织的设计过于复杂。优先使用对象的组合/聚合有助于保持每个类的封装被集中在单个任务上。

聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分;组合则表示一种强的拥有关系,体现的是严*的部分与整体的关系,并且部分和整体的生命周期一样。

UML图如下:
这里写图片描述

//相当于品牌父类class Abstratction{    protected Implementor implementor;    public void SetImplementor(Implementor implementor)    {        this.implementor = implementor;    }    public virtual void Operation()    {        implementor.Operation();    }}//相当于具体品牌class RefinedAbstraction : Abstraction{    public override void Operation()    {        implementor.Operation();    }}//相当于软件父类abstract class Implementor{    public abstract void Operation(); }//相当于具体运行的软件Aclass ConcreteImplementorA : Implementor{    public override void Operation()    {        Print("ConcreteImplementorA");    }}//相当于具体运行的软件Bclass ConcreteImplementorB : Implementor{    public override void Operation()    {        Print("ConcreteImplementorB");    }}static void Main(string[] args){    Abstraction ab = new RefinedAbstraction();    ab.SetImplementor(new ConcreteImplementorA());    ab.Operation();    ab.SetImplementor(new ConcreteImplementorB());    ab.Operation();    console.Read();}

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。另外我们还需要掌控好这多个维度变化的分类,所以理解起来稍微复杂一点。

桥接模式的好处在于现在假如增加新的软件,那么也就是增加一个新的软件类并加以调用即可,而不会影响其他的类。其实这也恰好是开放-封闭原则的应用,封闭修改,开放拓展。

参考书籍:《大话设计模式》

0 1
原创粉丝点击