首页 > 技术文章 > gof23 适配器模式

fuyujian 2015-07-28 15:38 原文

namespace Adapter
{
    class Program
    {
        static void Main(string[] args)
        {
            //原实现
            ClassBase customa = new ClassA();
            customa.Display();
            //新需求
            ClassBase custom = new ClassC();
            custom.Display();
        }
    }

    //项目中已存在的class
    public class ClassBase
    {
        public virtual void Display()
        {
            Console.WriteLine("this is a base");
        }
    }

    public class ClassA : ClassBase
    {
        public override void Display()
        {
            Console.WriteLine("this is a ClassA");
        }
    }

    public class ClassB : ClassBase
    {
        public override void Display()
        {
            Console.WriteLine("this is a ClassB");
        }
    }

    public class OtherClass
    {
        public void DisplayStr()
        {
            Console.WriteLine("this is a OtherClass");
        }
    }

    //目前的需求,ClassBase增加DisplayStr的功能
    //解决方案一:
    //新建class 继承classbase,实现  DisplayStr的逻辑,同样的逻辑重复两遍或多遍
    //解决方案二:
    //使用adapter模式
    public class ClassC : ClassBase
    {
        public override void Display()
        {
            var adapter = new OtherClass();
            adapter.DisplayStr();
        }
    }
}

运行结果:

《设计模式》一书中是这样给适配器模式定义的:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

以我们上面的例子为说明:

ClassBase的所有子类没有对OtherClass中DisplayStr的实现,目前的需求是系统需要一个继承自ClassBase并实现DisplayStr功能的子类。

方案一:

增加子类继承ClassBase,把DisplayStr的实现逻辑重复一遍

方案二:

使用适配器模式

增加子类继承ClassBase,重写父类方法,方法体内调用OtherClass的DisplayStr方法,这样同样的逻辑不需要重写一次,也实现了DisplayStr功能。

说白一点,通过类的继承,方法的重写简单的增加了一个功能。

多说一句

设计模式就是利用继承,封装,多态三大特性,通过各种组合有针对性的解决某一方面的问题。

实际生产中,可能我们已经在不知不觉中使用了设计模式,只是我们不知道。

对于出现的问题,也没有必要去硬套设计模式,可能你遇见的问题并不能用某一种设计模式来解决,当你解决这个问题后,他本身我们就可以称作一种设计模式,盗用师兄的一句话“设计模式,就是类的玩法”。

推荐阅读