zoukankan      html  css  js  c++  java
  • 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,使得二者存在两个独立变化的理解

  • 相关阅读:
    Azure 虚拟机诊断设置问题排查
    虚拟机压力测试延迟高的可能原因及 ILPIP 配置 / 查询脚本
    理解 Azure 平台中虚拟机的计算能力
    如何复制或导出托管磁盘
    理解托管磁盘的原理与优势
    Azure 托管镜像和非托管镜像对比
    如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
    如何将同一 VNET 下的虚拟机从经典部署模型迁移到 Azure Resource Manager
    如何将使用托管磁盘虚拟机的 OS 盘挂载到其他虚拟机上
    基于 Azure 托管磁盘配置高可用共享文件系统
  • 原文地址:https://www.cnblogs.com/May-day/p/8569197.html
Copyright © 2011-2022 走看看