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

    一、定义

    适配器模式把一个类的接口,变换成客户端所期待的另一种接口,使原本因接口不匹配的两个类能够在一起工作。

    二、结构

    角色

    • Client:用户类,使用新接口Target来完成某些特定的需求。
    • Target:新的接口类,开放特定接口request来完成某些特定操作,与Client协作。
    • Adaptee:原有的类,即需要适配的类或适配者类。
    • Adapter:适配器类,将Adaptee中的接口封装成Target中的新接口,来满足新的需求。

    协作

    • Client调用Adapter实例的操作,Adapter使用Adaptee来完成这些被调用的操作。

    :类图中表示的是适配器模式两种类图中的对象适配器类图(采用继承实现),另外一种类适配器通过多重继承两个类或实现两个接口来实现(采用对象组合方式实现)。

    三、实现

     对象适配器

    namespace DesignPatterns.Adapter
    {
        class Program
        {
            static void Main(string[] args)
            {
                //使用特殊功能类,即适配类,  
                // 需要先创建一个被适配类的对象作为参数  
                PowerAdapter adapter = new PowerAdapter(new RussiaSocket());
                adapter.Charge();
            }
        }
    
        /// <summary>
        /// 俄罗斯插座
        /// PS: 已存在的、具有特殊功能、但不符合我们既有的标准接口的类  
        /// </summary>
        public class RussiaSocket
        {
            //双脚圆形充电
            public void SpecificCharge()
            {
                Console.WriteLine("充电中...");
            }
        }
    
    
        /// <summary>
        /// 自带的充电插头 - 双脚扁头
        /// PS: 目标接口,或称为标准接口
        /// </summary>
        public interface ICharger
        {
           void Charge();
        }
    
    
        /// <summary>
        /// 电源适配器 
        /// PS: 适配器类,直接关联被适配类,同时实现标准接口
        /// </summary>
        public class PowerAdapter : ICharger
        {
            // 直接关联被适配类
            private readonly RussiaSocket _russiaSocket;
            // 可以通过构造函数传入具体需要适配的被适配类对象
            public PowerAdapter(RussiaSocket russiaSocket)
            {
                _russiaSocket = russiaSocket;
            }
            
            public void Charge()
            {
                // 这里是使用委托的方式完成特殊功能
                Console.WriteLine("我是适配类:双脚扁头充电->可以在->双脚圆形插孔充电.");
                _russiaSocket.SpecificCharge();
            }
        }
    
    }

    四、适用场景

        1、 重复使用现有的类,而此类的接口不符合系统的需要。在遗留代码复用、类库迁移等方面非常有用。

      2、 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

      3、 使用第三方组件或中间件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能,避免重复造轮子。

    五、优缺点

    优点:

    1、将目标类和适配者类解耦

    2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性

    3、灵活性和扩展性都非常好,符合开闭原则

      类适配器还有的优点:

        由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

      类适配器的缺点:

        对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。

      对象适配器还有的优点:

        把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。

      对象适配器的缺点:

        与类适配器模式相比,要想置换适配者类的方法就不容易。

     

    欢迎阅读本系列文章:Head First设计模式之目录

  • 相关阅读:
    C#中IEnumerable、ICollection、IList、List之间的区别
    H5中画图标签Canvas---画矩形,画线,画圆,渐变色,图形载入
    centos启用ftp功能
    CentOS 7 安装FTP服务器(vsftpd)
    Linux下如何修改用户默认目录
    Centos搭建FTP服务器
    MyBatis 示例之存储过程
    MyBatis:MyBatis操作MySQL存储过程
    mybatis的select、insert、update、delete语句
    日常运维中的相关日志切割处理方法总结 [Logrotate、python、shell脚本实现 ]
  • 原文地址:https://www.cnblogs.com/xcsn/p/7237174.html
Copyright © 2011-2022 走看看