设计模式之桥接模式

来源:互联网 发布:淘宝网儿童内衣 编辑:程序博客网 时间:2024/05/29 10:18

举例:

有两个手机品牌A和B,A品牌手机拥有手游、MP3播放等功能,B手机也拥有手游,MP3播放等功能。

按照手机品牌其代码设计如下:

1、解决方案

按照手机品牌齐代码设计如下:


按照手机软件其代码设计如下:

上面两个的设计方法的问题是:

对象的继承关系是在编译时就定义好了,所以无法再运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化,当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。

因此,在面向对象设计中,还有一个很重要的原则,就是合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承。

2、合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承

(1)聚合表示一种弱的“拥有关系”,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;

(2)合成则是一种强的“拥有”关系,体现了严格地部分和整体的关系,部分和整体的生命周期一样。

(3)合成/聚合如下图示例:

3、只有“is-a”的关系时才使用继承,由于手机品牌和手机软件之间应该属于聚合关系,所以应将手机品牌和手机软件分开设计,代码设计如下::

4、代码实现如下:

首先设计手机软件抽象类

    /// <summary>
    /// 手机软件抽象类
    /// </summary>
    public abstract class HandSetSoft
    {
        public abstract void Run();
    }

然后设计手机品牌抽象类:

    /// <summary>
    /// 手机品牌抽象类
    /// </summary>
    public abstract class HandSetBrand
    {
        private string _name;
        public HandSetBrand(string name)
        {
            _name = name;
        }
        private HandSetSoft _soft; //此处即是聚合的反应
        public void SetHandSetSoft(HandSetSoft soft)
        {
            _soft = soft;
        }
        public void Run()
        {
            Console.Write("品牌"+_name);
            _soft.Run();
        }
    }

最后设计手机软件和手机品牌的实现类:

    /// <summary>
    /// 手机品牌A
    /// </summary>
    public class HandSetBrandA:HandSetBrand
    {
         public HandSetBrandA(string name)
            : base(name)
        {
        }
    }
    /// <summary>
    /// 手机品牌B
    /// </summary>
    public class HandSetBrandB : HandSetBrand
    {
        public HandSetBrandB(string name)
            : base(name)
        {
        }
    }
    /// <summary>
    /// 手机游戏实现类
    /// </summary>
    public class HandSetGame:HandSetSoft
    {
        public override void Run()
        {
            Console.WriteLine("运行手机游戏");
        }
    }
    /// <summary>
    /// MP3软件实现类
    /// </summary>
    public class HandSetMP3:HandSetSoft
    {
        public override void Run()
        {
            Console.WriteLine("运行MP3软件");
        }
    }


5、总结

桥接模式:实现系统可能有多角度分类(比如按照手机软件分类或者手机品牌分类),每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

0 0
原创粉丝点击