C#设计模式:桥接模式(Bridge Pattern)

一,桥接模式,直接上代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _7.桥接模式
{
    //桥梁模式的用意是"将抽象化与实现化脱耦,使得二者存在两个独立变化的维度:人和人的事件"
    //抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
    class Program
    {
        static void Main(string[] args)
        {
            People p1 = new Chinese(new ChineseSpeak());
            p1.PossceEvent();

            People p2 = new Usa(new UsaSpeak());
            p2.PossceEvent();
        }
    }

    public abstract class People         //抽象部分。该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类
    {
        private PeopleEvent peopleEvent { get; set; }    //定义接口或抽象类变量
        public People(PeopleEvent _peopleEvent)  //构造注入,接口或抽象类的实例
        {
            this.peopleEvent = _peopleEvent;
        }     
        public void PossceEvent()   //抽象化与实现化脱耦
        {
            peopleEvent.Say();
        }   
    }

    public abstract class PeopleEvent//实现部分。可以为接口或者是抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由实现部分提供基本的操作,而抽象部分定义的则是基于实现部分基本操作的业务方法;
    {
        public abstract void Say();
    }    

    public class Chinese : People     //优化的抽象部分。抽象部分的具体实现,该类一般对抽象部分的方法进行完善和扩展;
    {
        public Chinese(PeopleEvent _peopleEvent)
            : base(_peopleEvent)
        {

        }
    }
    public class ChineseSpeak : PeopleEvent    //实现部分的具体实现。完善实现部分中定义的具体逻辑。
    {
        public override void Say()                //实现事件,这里针对不同的人,实现事件不一样,中国人说中文
        {
            Console.WriteLine("中国人说中文");
        }
    }

    public class Usa : People  //优化的抽象部分。抽象部分的具体实现,该类一般对抽象部分的方法进行完善和扩展;
    {
        public Usa(PeopleEvent _peopleEvent)
            : base(_peopleEvent)
        {

        }
    }  
    public class UsaSpeak : PeopleEvent //实现部分的具体实现。完善实现部分中定义的具体逻辑。
    {
        public override void Say()           //实现事件,这里针对不同的人,实现事件不一样,美国人说英语
        {
            Console.WriteLine("美国人说英语");
        }
    }  
}

二,总结:

1,桥梁模式的用意是"将抽象化与实现化脱耦,使得二者存在两个独立变化的维度(如上代码的人和人的事件)

2,当我们看到将抽象化与实现化脱耦,就会想到依赖注入,不错,这里就是使用依赖注入的构造注入的思想,将抽象和现实解耦,也就是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。

3,但抽象和现实解耦还不是完全的桥梁模式,我们还需要使得二者可以独立地变化,那怎么才是独立的变化呢?

1》如上代码,抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。

2》也就是根据上面的定义People可以有中国人和美国人,是一种维度的变化,而中国人和美国人又分别说不同的话,中文和英文这也是不同一个维度的变化,这也是抽象People和具体实现PeopleEvent,使得二者存在两个独立变化的理解

原文地址:https://www.cnblogs.com/May-day/p/8569197.html