• 设计模式学习笔记——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()方法),或者可以理解为,为所有的类提供了通用的实现方式

    将偷懒进行到极致,是一个程序员的基本素养
  • 相关阅读:
    Hadoop之Linux源代码编译
    《程序猿的修炼——从优秀到卓越》读书笔记(二)——运营和项目管理
    WPF文字渲染相关的问题及解决
    APNS push server端 SSL3.0 转 TLS (iPhone苹果推送服务)
    14西安区域赛总结帖
    linux内核调试+qemu+eclipse【转】
    一步一步粗谈linux文件系统(三)----超级块(superblock)【转】
    block(data block,directory block)、inode、块位图、inode位图和super block概念详解【转】
    Linux文件系统及文件储存方式【转】
    简单虚拟文件系统的设计与实现【转】
  • 原文地址:https://www.cnblogs.com/bamboo-zhang/p/9130060.html
Copyright © 2020-2023  润新知