设计模式之桥接模式

    这节讲桥接模式(Bridge Pattern)。

    在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。

    为了解决上述问题,就出现了桥接模式,桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

    他的优点是:抽象与实现分离,扩展能力强符合开闭原则,符合合成复用原则,实现细节对客户透明,但由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,无疑增加了系统的理解与设计难度。

    下面通过包包有多种颜色为例演示一下桥接模式:

 class Program
    {
        static void Main (string[] args)
        {
            new LV(new Red()).BagColor();
            new LV(new Green()).BagColor();
            Console.ReadKey();
        }
    }


    /// <summary>
    /// 包包的颜色属性抽象(属性不止一种,此处为简化代码,只写一种属性的抽象)
    /// </summary>
    interface IColor
    {
        void showColor();
    }

    /// <summary>
    /// 属性的实现
    /// </summary>
    class Red:IColor
    {
        public void showColor()
        {
            Console.WriteLine("我是红色的。");
        }
    }
    /// <summary>
    /// 属性的实现
    /// </summary>
    class Green:IColor
    {
        public void showColor()
        {
            Console.WriteLine("我是绿色的。");
        }
    }

    /// <summary>
    /// 包包的抽象
    /// </summary>
    abstract class Bag
    {
        public IColor color = null;

        /// <summary>
        /// 实现不同颜色的表现
        /// </summary>
        /// <param name="color">注入包包颜色实现</param>
        public Bag(IColor color)
        {
            this.color = color;
        }

        public abstract void BagColor();
    }

    /// <summary>
    /// 具体的包包实现
    /// </summary>
    class LV:Bag
    {
        public LV(IColor color) : base(color)
        {
        }

        public override void BagColor()
        {
            color.showColor();
        }
    }

 运行结果如下:

 

 女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。

 

    个人公众号,热爱分享,知识无价。

posted @ 2020-11-10 19:57  宿春磊Charles  阅读(102)  评论(0编辑  收藏  举报