Adapter是Adaptee的子类 (3)、仅仅引入一个对象

时间:2022-06-13 06:44:51

原文:C#设计模式之六适配器模式(Adapter Pattern)【布局型】

一、引言

   从今天开始我们开始讲【布局型】设计模式,【布局型】设计模式有如下几种:适配器模式、桥接模式、装饰模式、组合模式、外不雅观模式、享元模式、代办代理模式。【创建型】的设计模式解决的是东西创建的问题,那【布局型】设计模式解决的是类和东西的组合关系的问题。今天我们就开始讲【布局型】设计模式里面的第一个设计模式,中文名称:适配器模式,英文名称:Adapter Pattern。说起这个模式其实很简单,在现实生活中也有很多实例,好比:我们手机的充电器,充电器的接头,有的是把两相电转换为三相电的,固然也有把三相电转换成两相电的。我们经常使用条记本电脑,条记本电脑的事情电压和我们家里照明电压是不一致的,,固然也就需要充电器把照明电压转换成条记本的事情电压,只有这样条记本电脑才可以正常事情。太多了,就不一一列举了。我们只要记住一点,适配就是转换,把不能在一起事情的两样对象通过转换,让他们可以在一起事情。

二、适配器模式的详细介绍

2.1、动机(Motivate)

   在软件系统中,由于应用环境的变革,每每需要将“一些现存的东西”放在新的环境中应用,但是新环境要求的接口是这些现存东西所不满足的。如何应对这种“迁移的变革”?如何既能操作现有东西的良好实现,同时又能满足新的应用环境所要求的接口?

2.2、意图(Intent)

   将一个类的接口转换成客户但愿的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起事情的那些类可以一起事情。                                                                   --《设计模式》Gof

2.3、布局图(Structure)

   适配器有两种布局

  1】、-东西适配器(更常用

        

Adapter是Adaptee的子类 (3)、仅仅引入一个对象



     东西适配器使用的是东西组合的方案,它的Adapter核Adaptee的关系是组合关系。

     OO中优先使用组合模式,组合模式不适用再考虑担任。因为组合模式越发松耦合,而担任是紧耦合的,父类的任何窜改都要导致子类的窜改。

  2】、-类适配器
       
        

Adapter是Adaptee的子类 (3)、仅仅引入一个对象



2.4、模式的构成

      可以看出,在适配器模式的布局图有以下角色:

      (1)、方针角色(Target):界说Client使用的与特定范围相关的接口。
   
      (2)、客户角色(Client):与切合Target接口的东西协同。
 
      (3)、被适副角色(Adaptee):界说一个已经存在并已经使用的接口,这个接口需要适配。
 
      (4)、适配器角色(Adapte) :适配器模式的核心。它将对被适配Adaptee角色已有的接口转换为方针角色Target匹配的接口。对Adaptee的接口与Target接口进行适配.

2.5 适配器模式的具体实现

   由于适配器模式有两种实现布局,今天我们针对每种都实现了本身的方法。

   1、东西的是适配器模式实现

1 namespace 东西的适配器模式 2 { 3 ///<summary> 4 ///家里只有两个孔的插座,也懒得买插线板了,还要花钱,但是我的手机是一个有3个小柱子的插头,明显直接搞不定,那就适配吧 5 ///</summary> 6 class Client 7 { 8 static void Main(string[] args) 9 { 10 //好了,此刻就可以给手机充电了 11 TwoHoleTarget homeTwoHole = new ThreeToTwoAdapter(); 12 homeTwoHole.Request(); 13 Console.ReadLine(); 14 } 15 } 16 17 /// <summary> 18 /// 我家只有2个孔的插座,也就是适配器模式中的方针(Target)角色,这里可以写成抽象类或者接口 19 /// </summary> 20 public class TwoHoleTarget 21 { 22 // 客户端需要的要领 23 public virtual void Request() 24 { 25 Console.WriteLine("两孔的充电器可以使用"); 26 } 27 } 28 29 /// <summary> 30 /// 手机充电器是有3个柱子的插头,源角色——需要适配的类(Adaptee) 31 /// </summary> 32 public class ThreeHoleAdaptee 33 { 34 public void SpecificRequest() 35 { 36 Console.WriteLine("我是3个孔的插头也可以使用了"); 37 } 38 } 39 40 /// <summary> 41 /// 适配器类,TwoHole这个东西写成接口或者抽象类更好,面向接口编程嘛 42 /// </summary> 43 public class ThreeToTwoAdapter : TwoHoleTarget 44 { 45 // 引用两个孔插头的实例,从而将客户端与TwoHole联系起来 46 private ThreeHoleAdaptee threeHoleAdaptee = new ThreeHoleAdaptee(); 47 //这里可以继续增加适配的东西。。 48 49 /// <summary> 50 /// 实现2个孔插头接口要领 51 /// </summary> 52 public override void Request() 53 { 54 //可以做具体的转换事情 55 threeHoleAdaptee.SpecificRequest(); 56 //可以做具体的转换事情 57 } 58 } 59 }


   2、类的适配器模式实现