关闭

适配器模式(Adapter Pattern)

标签: stringclass工作
168人阅读 评论(0) 收藏 举报
分类:

适配器模式(Adapter Pattern):
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的
那些类可以一起工作。

/// <summary>
    /// Target类:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
    /// </summary>
    public class Target
    {
        public virtual void Request()
        {
            Console.WriteLine("普通请求");
        }
    }

    /// <summary>
    /// 需要适配的类
    /// </summary>
    class Adaptee
    {
        public void SpecificRequest()
        {
            Console.WriteLine("特殊请求");
        }
    }

    /// <summary>
    /// 通过在内部包装一个Adaptee对象,把源接口转换成目标接口
    /// </summary>
    class Adapter : Target
    {
        private Adaptee adaptee = new Adaptee();

        //这样就可以把表面上调用Request()方法变成实际调用SpecificRequest()
        public override void Request()
        {
            adaptee.SpecificRequest();
        }
    }

    class Program
    {
        static void Main()
        {
            Target target = new Adapter();
            target.Request();
        }

    }

优势和缺陷:
适配器模式可以将一个类的接口和另一个类的接口匹配起来,使用的前提是你不能修改或不想修改原来的适配器母接口(Adaptee)
。例如,你向第三方购买了一些类、控件,但没有源程序,这是使用适配器模式,可以统一对象的访问接口。但客户调用可能需要
变动。

应用:
(1)对象需要利用现存的并且接口不兼容的类
(2)需要创建可重用的类协作其它接口不一定兼容的类
(3)需要使用若干个现存的子类但又不想派生这些子类中的每一个接口。

实例:篮球翻译

 

/// <summary>
    /// 球员类,有进攻和防守的方法
    /// </summary>
    public abstract class Player
    {
        protected string name;
        public Player(string name)
        {
            this.name = name;
        }
        //进攻
        public abstract void Attack();
        //防守
        public abstract void Defence();
    }

    /// <summary>
    /// 前锋类
    /// </summary>
    public class Forwards : Player
    {
        public Forwards(string name)
            :base(name)
        {
        }

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

        public override void Defence()
        {
            Console.WriteLine("前锋{0}防守",name);
        }
    }

    /// <summary>
    /// 中锋类
    /// </summary>
    public class Center : Player
    {
        public Center(string name)
            : base(name)
        {
        }

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

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

    /// <summary>
    /// 后卫类
    /// </summary>
    public class Guards : Player
    {
        public Guards(string name)
            : base(name)
        {
        }

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

        public override void Defence()
        {
            Console.WriteLine("后卫{0}防守", name);
        }
    }

    /// <summary>
    /// 外籍中锋
    /// Adaptee类,需要适配的类
    /// </summary>
    public 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);
        }

    }

    /// <summary>
    /// 翻译类:Adapter类
    /// </summary>
    public class Translator : Player
    {
        private ForeignCenter wjzf = new ForeignCenter();

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

        //翻译者讲Attack翻译为进攻告诉外籍中锋
        public override void Attack()
        {
            wjzf.进攻();
        }

        public override void Defence()
        {
            wjzf.防守();
        }
    }

 

客户端调用

//适配器模式
            AdapterPattern.Player player1 = new AdapterPattern.Forwards("巴蒂尔");
            player1.Attack();

            AdapterPattern.Player player2 = new AdapterPattern.Guards("艾克斯雷迪");
            player2.Attack();

            //翻译告诉姚明,教练要求进攻和防守
            AdapterPattern.Player yaoming = new AdapterPattern.Translator("姚明");
            yaoming.Attack();
            yaoming.Defence();


 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37012次
    • 积分:674
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:8篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论