C#设计模式之适配器模式

前言

这就好比是一个转接线一样。能用原配尽量原配,实在不匹配再考虑用转接线。

适配器模式

英文:Adapter

what

将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作。、

现在有两种适配器类型:类适配器模式和对象适配器模式。
C#中不支持多重继承,一个类只有一个父类,所以这里主要讲对象适配器。

情景

姚明在国外打球,他和其他队员都会打球,但是两者却说不一样的语言,这时候,就要有个翻译(适配器)来帮助它们对接。(这里,如果姚明很容易就学会英语,或者外国人很容易就学会中文,就不先考虑用翻译)

咱们经常使用电脑转接口,就是因为电脑插孔和显示器不匹配,所以需要一个转接口来将二者连接,这里的转接器就相当于适配器。

应用

在软件开发中,系统的数据和行为都正确,但接口不符,我们可以考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。
适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。、

主要用与软件开发后期或维护期。在接口不想通过时,首先不考虑适配器,应该考虑重构统一接口。在双方都不容易修改的时候再使用适配器模式适配。

代码展示

球员类:

//球员抽象类

abstract class Player
{
    protected string name;
    public Player(string name)
    {
        this.name = name;
    }

    //进攻和防守的方法

    public abstract void Attack();
    public abstract void Defense();
}

具体冲锋类:

//前锋类
    class Forwards:Player 
    {
        public Forwards(string name): base(name)
        {

        }
        public override void Attack()
        {
            Console.WriteLine("前锋{0}进攻",name);
        }
        public override void Defense()
        {
            Console.WriteLine("前锋{0}防守", name);
        }
    }

    //中锋类
    class Center : Player
    {
        public Center (string name): base(name)
        {

        }
        public override void Attack()
        {
            Console.WriteLine("中锋{0}进攻", name);
        }
        public override void Defense()
        {
            Console.WriteLine("中锋{0}防守", name);
        }
    }


    //后卫类,同上↑

外籍中锋类://不会说外文,需要翻译(适配器)

//外籍中锋

    class ForeignCenter
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public void 进攻()    //外籍中锋只懂得中文进攻
        {
            Console.WriteLine("外籍中锋{0}进攻",name);
        }

        public void 防守()
        {
            Console.WriteLine("外籍中锋{0}防守", name);
        }
    }

翻译类:

class Translator:Player
{
private ForeignCenter yao = new ForeignCenter();

    public Translator(string name)
        : base(name)
    {
        yao.Name = name;
    }

    public override void Attack()
    {
        yao.进攻();
    }

    public override void Defense()
    {
        yao.防守(); 
    }

客户端代码:

class Program
    {
        static void Main(string[] args)
        {
            Player cat = new Forwards("凯蒂猫");
            cat.Attack();

            Player dog = new Translator("阿拉斯加");
            dog.Attack();      //进攻
            dog.Defense();      //防守

            Console.Read();
        }
    }

效果图:

适配器

后记

相对于之前两个模式来说,这个的代码更好理解,而且作用也一目了然。
但是希望我们做项目时尽量不会用到这个模式,因为感觉它就是用来当补丁的~~

猜你喜欢

转载自blog.csdn.net/carrie_q/article/details/80560454