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

    将偷懒进行到极致,是一个程序员的基本素养
  • 相关阅读:
    ACM: Copying Data 线段树-成段更新-解题报告
    POJ 2488 A Knight's Journey
    POJ 3349 Snowflake Snow Snowflakes Hash
    POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数
    POJ 1035 Spell checker 简单字符串匹配
    POJ 3267 The Cow Lexicon 简单DP
    POJ 1459 Power Network 最大流(Edmonds_Karp算法)
    POJ 3687 Labeling Balls 逆向建图,拓扑排序
    HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)
    POJ 3026 Borg Maze bfs+Kruskal
  • 原文地址:https://www.cnblogs.com/bamboo-zhang/p/9130060.html
Copyright © 2020-2023  润新知