设计模式学习笔记——Adapter 适配器模式

适配器设计模式的适应场景:

一般情况是上端固定,下端固定,下端功能不满足或跟上端不协调,使用适配器重新包一层(继承适配器接口,以满足上端需求,继承下层类,以调用方法),使下端代码能满足上端需求(欺骗,强行满足),即类适配器

 public class MyLuceneAdapter : MyLucene, ISqlHelper
    {

        public void Add()
        {
            base.Add();
        }

        public void Delete()
        {
            base.Delete();
        }

        public void Update()
        {
            //Console.WriteLine("根本没有实现");
            //throw new NotImplementedException();

            base.Delete();
            base.Add();

        }

        public void Search()
        {
            base.Search();
        }
    }

类适配器存在的问题是,下端也许存在不满足上端的方法,会抛出异常或提供假的实现方式,而上端并不知道

对象适配器:

1、建一个接口,约定适配器必须提供的方法(不满足的部分不约定)

public interface IPhone
    {
        void Call();
    }

2、定义适配器,在适配器的初始化方法中传入接口,用接口调用约定的方法,统一实现未约定的方法(注意,适配器本身并未继承接口)

public class PhoneAdapter
    {
        private IPhone _IPhone;
        public PhoneAdapter(IPhone iPhone)
        {
            _IPhone = iPhone;
        }

        public void Call()
        {
            _IPhone.Call();//用接口调用约定的方法
        }

        public void Message()
        {
            Console.WriteLine("Message");//统一实现未约定的方法
        }
    }

3、使类继承接口

3.1 满足约束的

public class Xiaomi : IPhone
    {
        public void Call()
        {
            Console.WriteLine("这里是{0}的Call", this.GetType());
        }

        public void Message()
        {
            Console.WriteLine("这里是{0}的Message", this.GetType());
        }
    }

3.2不满足约束的(Dageda 本身并不没有Message功能)

    public class Dageda : IPhone
    {
        public void Call()
        {
            Console.WriteLine("这里是{0}的Call", this.GetType());
        }
    }

4、使用时先初始化实现接口的类,然后在初始化适配器时,将实现接口的类传入,然后使用适配器调用类的方法

            Dageda dageda = new Dageda();
            PhoneAdapter phoneAdapter = new PhoneAdapter(dageda);
       phoneAdapter.Call();
            phoneAdapter.Message();

对象适配器相对于类适配器,为适配器提供了扩展性,但是会覆盖类本身的方法(适配器的通用方法Message()将会覆盖Xiaomi的Message()方法),或者可以理解为,为所有的类提供了通用的实现方式

猜你喜欢

转载自www.cnblogs.com/bamboo-zhang/p/9130060.html