Head First设计模式之适配器模式

简介: 一、定义 适配器模式把一个类的接口,变换成客户端所期待的另一种接口,使原本因接口不匹配的两个类能够在一起工作。   二、结构 角色: Client:用户类,使用新接口Target来完成某些特定的需求。

一、定义

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

 

二、结构

角色

  • 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设计模式之目录

 

相关文章
|
1月前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
|
1月前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
37 4
|
18天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
|
18天前
|
设计模式 Go
[设计模式 Go实现] 结构型~适配器模式
[设计模式 Go实现] 结构型~适配器模式
|
21天前
|
设计模式 Java
【设计模式系列笔记】适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。它允许原本由于接口不匹配而无法一起工作的类能够协同工作。适配器模式通常涉及一个称为适配器的类,它充当两个不兼容接口之间的桥梁。
39 6
|
1月前
|
设计模式 Java 数据库
小谈设计模式(18)—适配器模式
小谈设计模式(18)—适配器模式
|
2月前
|
设计模式 算法 API
适配器模式:C++设计模式中的瑞士军刀
适配器模式:C++设计模式中的瑞士军刀
48 0
|
2月前
|
设计模式
设计模式之适配器模式
设计模式之适配器模式
|
2月前
|
设计模式 Java Linux
适配器模式--设计模式
适配器模式--设计模式
18 0
|
2月前
|
设计模式 Java 程序员
【设计模式】适配器模式
【设计模式】适配器模式