c#适配器模式(Adapter)

无意间看到ArrayList的Adapter方法,没学过,学习一下

做了一个最简单的demo,一起来学一下吧

这是一个设计模式,叫适配器模式,一开始不是很理解,看了大话模式里的适配器模式之后,自己做了练习就理解了

1.下面是英文文档转换中文文档的适配器Demo

客户端:

//就拿开发文档举例吧,一开始发布的版本都是英文版,我们需要中文版
    internal class Common
    {
        public void English()
        {
            Console.WriteLine("英文版");
        }
    }
    //定义中文类
    internal class ChineseVersion
    {
        /// <summary>
        /// 定义一个中文版的方法
        /// </summary>
        public virtual void Chinese()
        {
            Console.WriteLine("中文版");
        }
    }
    /// <summary>
    /// 继承中文版
    /// </summary>
    internal class Translate: ChineseVersion
    {
        //虽然是重写中文版的方法,但是调用的却是英文版原版的文档,所以翻译过来就是我们要的英文版翻译成中文的文档了
        private Common common = new();
        
        public override void Chinese()
        {
            base.Chinese();
            common.English();
        }
    }
中英文转换

服务端调用(就是控制台调用)

Translate translate = new();
translate.Chinese();
program

 

2.下面这个是拿NBA球星姚明举例,是跟着大话设计模式做的,去了美国之后的姚明语言不通,这时候该怎么办呢,需要一个翻译,所以这个时候也可以体现我们的适配器模式

//设计一个球员抽象类,传入名称,有进攻和防守的抽象方法
    //后卫,中锋,前锋都是球员
    /// <summary>
    /// 球员抽象类
    /// </summary>
    internal abstract class Player
    {
        protected string name;
        internal Player(string name)
        {
            this.name = name;
        }
        public abstract void Attack();
        public abstract void Defend();
    }
    /// <summary>
    /// 后卫
    /// </summary>
    internal class Guard : Player
    {
        internal Guard(string name):base(name)
        {

        }
        public override void Attack()
        {
            Console.WriteLine(" 后卫 {0} 进攻",name);
        }

        public override void Defend()
        {
            Console.WriteLine($" 后卫 {name} 防守");
        }
    }
    /// <summary>
    /// 中锋
    /// </summary>
    internal class Centre : Player
    {
        internal Centre(string name) : base(name)
        {

        }
        public override void Attack()
        {
            Console.WriteLine($" 中锋 {name} 进攻");
        }

        public override void Defend()
        {
            Console.WriteLine($" 中锋 {name} 防守");
        }
    }
    /// <summary>
    /// 前锋
    /// </summary>
    internal class Forward : Player
    {
        internal Forward(string name) : base(name)
        {

        }
        public override void Attack()
        {
            Console.WriteLine($" 前锋 {name} 进攻");
        }

        public override void Defend()
        {
            Console.WriteLine($" 前锋 {name} 防守");
        }
    }
    /// <summary>
    /// 外籍中锋
    /// </summary>
    internal class ForeignCentre
    {
        //因为外部一会要调用这个变量,所以不设置私有
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public void 进攻()
        {
            Console.WriteLine(" 外籍中锋{0} 进攻",name);
        }
        public void 防守()
        {
            Console.WriteLine(" 外籍中锋{0} 防守", name);
        }
    }
    /// <summary>
    /// 翻译官
    /// </summary>
    internal class Translator : Player
    {
        private ForeignCentre foreignCentre=new ForeignCentre();
        internal Translator(string name):base(name)
        {
            foreignCentre.Name = name;
        }
        public override void Attack()
        {
            foreignCentre.进攻();
        }

        public override void Defend()
        {
            foreignCentre.防守();
        }
    }
客户端
            Player forward = new Forward("巴蒂尔");
            forward.Attack();
            forward.Defend();
            Player Centre = new Translator("姚明");
            Centre.Attack();
            Centre.Defend();
               
服务端

又get了一个技能

简单来说,就是你需要什么类型的数据,我就输出什么类型的数据,里面的数据不变,都给你存起来,只是省去了中间类型转换的复杂操作了,

你需要看中文文档,我给你输出中文文档,你只需要把英文版的文档给我,我就给你中文文档

另外奉上大话设计模式电子书:

链接:https://pan.baidu.com/s/1zYFFoGJLuMeiBl9ljzonnw
提取码:lkcb

posted @ 2021-10-29 11:48  rookiexwang  阅读(169)  评论(0编辑  收藏  举报