一,桥接模式,直接上代码
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,使得二者存在两个独立变化的理解