设计模式(五)适配器

来源:互联网 发布:编程猫的网址 编辑:程序博客网 时间:2024/05/29 18:36

适配器模式——把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。适配器模式有类的适配器模式和对象的适配器模式两种形式。

类的适配器模式

class Test    {               static void Main()        {            ThreeHole three = new ThreeHole();            three.TwoHoleFun();            Console.ReadLine();        }       public class TwoHole       {           public void TwoHoleFun()           {               Console.WriteLine("222");           }       }       public class ThreeHole : TwoHole,IThreeHole       {           public void Request()           {               this.TwoHoleFun();           }       }        /// <summary>        /// Virtual方法可以被重写,abstract必须被重写        /// abstract和接口interface很像,使用interface为了实现多继承        /// public abstract void test()方法后面直接括号        /// public virtual void test(){}方法必须有实现,哪怕只是一对括号        /// </summary>       public  interface IThreeHole       {             void Request();       }        /*从上面代码中可以看出,客户端希望调用Request方法(即三个孔插头),         * 但是我们现有的类(即2个孔的插头)并没有Request方法,         * 它只有TwoHoleFun方法(即两个孔插头本身的方法),         * 然而适配器类(适配器必须实现三个孔插头接口和继承两个孔插头类)         * 可以提供这种转换,它提供了Request方法的实现(其内部调用的是两个孔插头,         * 因为适配器只是一个外壳罢了,包装着两个孔插头(因为只有这样,电器才能使用),         * 并向外界提供三个孔插头的外观,)以供客户端使用。*/    }  


对象的适配器模式

  class Test    {               static void Main()        {            ThreeHole three = new Adapt();            three.Request();            Console.ReadLine();        }       public class TwoHole       {           public void TwoHoleFun()           {               Console.WriteLine("2");           }       }       public class ThreeHole       {           public virtual void Request()           {               Console.WriteLine("3");           }       }       public class Adapt : ThreeHole       {           public TwoHole twowholeadaptee = new TwoHole();           public override void Request()//重写threehole的方法           {               twowholeadaptee.TwoHoleFun();           }       }           } 

类的适配器模式:

优点:

  • 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”
  • 可以重新定义Adaptee(被适配的类)的部分行为,因为在类适配器模式中,Adapter是Adaptee的子类
  • 仅仅引入一个对象,并不需要额外的字段来引用Adaptee实例(这个即是优点也是缺点)。

缺点:

  • 用一个具体的Adapter类对Adaptee和Target进行匹配,当如果想要匹配一个类以及所有它的子类时,类的适配器模式就不能胜任了。因为类的适配器模式中没有引入Adaptee的实例,光调用this.SpecificRequest方法并不能去调用它对应子类的SpecificRequest方法。
  • 采用了 “多继承”的实现方式,带来了不良的高耦合。

对象的适配器模式

优点:

  • 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”(这点是两种实现方式都具有的)
  • 采用 “对象组合”的方式,更符合松耦合。

缺点:

  • 使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。




0 0
原创粉丝点击