zoukankan      html  css  js  c++  java
  • 设计模式之适配器模式

     适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。

     作用(解决的问题):Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

     组成:
     1、目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
     2、需要适配的类(Adaptee):需要适配的类或适配者类。
     3、适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

     优点:
     1、通过适配器,客户端可以调用统一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
     2、复用了现存的类,解决了现存类和复用环境要求不一致的问题。
     3、将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
     4、一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

     缺点:
     对于对象适配器来说,更换适配器的实现过程比较复杂。

     适用场景:
     1、系统需要使用现有的类,而这些类的接口不符合系统的接口。
     2、想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
     3、两个类所做的事情相同或相似,但是具有不同接口的时候。
     4、旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
     5、使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

    实现:

    1、类的适配器模式,使用继承实现

    // 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
        class Adaptee
        {
            public void specificRequest()
            {
                Console.WriteLine("被适配类具有 特殊功能...");
            }
        }
    
        // 目标接口
        interface Target
        {
            void Request();
        }
    
        // 具体目标类,只提供普通功能
        class ConcreteTarget : Target
        {
            public void Request()
            {
                Console.WriteLine("普通类 具有 普通功能...");
            }
        }
    
        // 适配器类,继承了被适配类,同时实现标准接口
        class Adapter : Adaptee, Target
        {
            public void Request()
            {
                this.specificRequest();
            }
        }
    
        class Client
        {
            public static void Main(String[] args)
            {
                // 使用普通功能类
                Target concreteTarget = new ConcreteTarget();
                concreteTarget.Request();
    
                // 使用特殊功能类,即适配类
                Target adapter = new Adapter();
                adapter.Request();
    
                Console.ReadKey();
            }
        }

    上面的代码我们可以通过统一接口Request()访问到普通功能和特殊功能。这种实现的适配器称为类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 C# 不支持多继承,所以这样来实现),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。

    2、对象适配器,采用对象组合方式实现

    // 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
        class Adaptee
        {
            public void specificRequest()
            {
                Console.WriteLine("被适配类具有 特殊功能...");
            }
        }
    
        // 目标接口
        interface Target
        {
            void Request();
        }
    
        // 具体目标类,只提供普通功能
        class ConcreteTarget : Target
        {
            public void Request()
            {
                Console.WriteLine("普通类 具有 普通功能...");
            }
        }
    
        // 适配器类,直接关联被适配类,同时实现标准接口
        class Adapter : Target
        {
            private Adaptee adaptee;
    
            public Adapter(Adaptee adaptee)
            {
                this.adaptee = adaptee;
            }
            public void Request()
            {
                this.adaptee.specificRequest();
            }
        }
    
        class Client
        {
            public static void Main(String[] args)
            {
                // 使用普通功能类
                Target concreteTarget = new ConcreteTarget();
                concreteTarget.Request();
    
                // 使用特殊功能类,即适配类
                Target adapter = new Adapter(new Adaptee());
                adapter.Request();
    
                Console.ReadKey();
            }
        }
  • 相关阅读:
    MFC程序执行过程剖析
    不同位数操作系统的 数据长度
    测试:safenet提供的CheckKey函数 内存泄漏。具体来说是句柄.
    关于更改项目名称
    内存泄漏相关的
    美化MFC 之调整静态文本的颜色 字体。 用于添加公司标题 联系方式 口号等数据
    DAVINCI DM365-DM368开发攻略——开发环境搭建(DVSDK4.02)
    Removing Unnecessary HTTP Headers in IIS and ASP.NET 在ASP.Net和IIS中删除不必要的HTTP响应头
    Implementing Singleton in C#
    WEBAPI VS WCF微软随.NET 4.5发布新REST API框架
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/9537816.html
Copyright © 2011-2022 走看看