首页 > 技术文章 > 代理模式VS适配器模式

huohuoL 2014-03-26 20:55 原文

适配器模式

定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。简单点就是需要的东西就在面前,但却不能使用,而短时间又无法改造=它,于是我们就想办法适配它。

举一个生活中最常见的例子!就如我们的球类吧!如排球,如果只是想拿着排球在自行车老大爷那说点好的来打气是行不通,因为那的打气筒是无法往你的排球里灌入气体的,所以你得必备一个排球专用的气针才可啊!而在此“气针”则是“适配”。


namespace 排球打气
{
    class Program
    {
        static void Main(string[] args)
        {
            Pump b = new Bicycle("自行车");
            b.Inflate();

            Pump v = new Needle("排球");   //气针完美的把两者联系起来
            v.Inflate();

            Console.Read();
        }
    }
    //打气筒
    abstract class Pump
    {
        protected string kind;  //打气的种类
        public Pump (string kind)
        {
            this.kind = kind;
        }
        public abstract void Inflate();
    }
    //自行车
    class Bicycle:Pump
    {
        public Bicycle (string kind):base(kind )
        {
        }
        public override void Inflate()
        {
            Console.WriteLine("霍霍给{0}打气", kind);
        }
    }
    //排球
    class Volleyball
    {
        public string kind;
        public string Kind
        {
            get { return kind; }
            set { kind = value; }
        }
        public void 打气()
        {
            Console.WriteLine("霍霍拿气针给{0}打气", kind);
        }
    }
    //气针
    class Needle:Pump
    {
        public Volleyball pqdq = new Volleyball();  //实例化一个排球,通过气针与打气筒有联系
        public Needle (string kind):base(kind )
        {
            pqdq.kind = kind;
        }
        public override void Inflate()      //打气筒通过气针给排球打气
        {
            pqdq.打气();
        }
运行结果:


代理模式

定义:为其他对象提供一种代理以控制对这个对象的访问。也就是真实对象的代表。举一个特别简单的例子,如电脑桌面的快捷方式就是一个代理对象,快捷方式是他所引用的一个代理。

分类:

远程代理 一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
虚拟代理 根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的对象。
安全代理 用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
智能指引 当调用真是的对象时,代理处理另外一些事。
前阵子很火热的一个韩剧《来自星星的你》大家都看疯了,尤其是吸引了大多在校以及不在校的青春型的女生。记得里边印象最深的就是千颂伊由于被媒体误会之后,最后由于好面子,让都敏俊来当自己的经纪人,当然最后也只剩下了都敏俊。经纪人不就是一个很好的代理吗?


namespace 千颂伊和都敏俊
{
    class Program
    {
        static void Main(string[] args)
        {
            Star qian = new Star();
            qian.Name = "千颂伊大小姐";

            Dominjun daili = new Dominjun(qian);
            daili.GoBeauty();        //千颂伊的行程安排
            daili.GoSchool();
            daili.GoRehealsal();

            Console.Read();
        }
    }
    interface ISchedule
    {
        void GoBeauty();
        void GoSchool();
        void GoRehealsal();   //排练
    }
    //千颂伊
    class Qiansongyi : ISchedule
    {
        Star Qsy;
        public Qiansongyi (Star Qsy)
        {
            this.Qsy = Qsy;
        }
        public void GoBeauty()
        {
            Console.WriteLine(Qsy .Name +"要去美容馆");
        }
        public void GoSchool()
        {
            Console.WriteLine(Qsy .Name +"要去学校上课");
        }
        public void GoRehealsal()
        {
            Console.WriteLine(Qsy .Name +"要去排练电视节目");
        }
    }
    //都敏俊
    class Dominjun:ISchedule 
    {
        Qiansongyi yy;
        public Dominjun (Star Qsy)
        {
            yy = new Qiansongyi(Qsy);
        }
        public void GoBeauty()
        {
            yy.GoBeauty();
        }
        public void GoSchool()
        {
            yy.GoSchool();
        }
        public void GoRehealsal()
        {
            yy.GoRehealsal();
        }
    }
    class Star
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
运行结果:

对比:

由结构图就可以发现其区别:

代理模式 适配器模式
原类和代理类继承同一父类 只有适配继承目标接口
原类对象与代理对象接口相同 原类要通过适配来连接父类
起到了隐藏原类的作用
    


推荐阅读