【愚公系列】2021年12月 二十三种设计模式(六)-适配器模式(Adapter Pattern)

简介: 【愚公系列】2021年12月 二十三种设计模式(六)-适配器模式(Adapter Pattern)

文章目录

前言

一、适配器模式(Adapter Pattern)

二、使用步骤

角色

示例

类的适配器模式

对象的适配器模式

总结

优点

缺点

使用场景

前言

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。


提示:以下是本篇文章正文内容,下面案例可供参考


一、适配器模式(Adapter Pattern)

适配器模式属于结构型模式,把一个类的接口变成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。


适配器模式又可以分为4种类型,类适配器模式、对象适配器模式、单接口适配器模式(缺省适配器模式)和双向适配器模式。后2种模式的实现比较复杂并且在实际开发过程中很少使用,故本博文只讨论前2种模式。


二、使用步骤

角色

1、抽象目标(Target)


抽象目标类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于C#语言不支持多重继承,所以它只能是接口;


2、适配器(Adapter)


它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,它是适配器模式的核心;


3、适配者(Adaptee)


适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。


示例

image.png

命名空间AdapterPattern包含ClassBased和ObjectBased子命名空间,分别表示基于类的适配器模式和基于对象的适配器模式。类的适配器中包含家用电器类、电压类、目标动作接口和手机适配器类。对象的适配器中包含适配者、适配器、目标接口和目标基类。本案例尝试使用手机适配器将家用电器的电压从220V适配至3V。

namespace AdapterPattern

类的适配器模式

namespace AdapterPattern.ClassBased
public class Voltage {
    public uint Value { get; set; }
}

电压Voltage类,包含一个无符号int类型的电压值。

public class Appliance {
    public Voltage GetVoltage() {
        return new Voltage { Value = 220 };
    }
}

家用电器Appliance类,包含一个获取电压的GetVoltage方法。

public interface ITarget {
    Voltage GetMobileVoltage();
}

目标接口ITarget,包含一个获取手机电压的GetMobileVoltage方法。这是我们要适配的目标动作。

public class MobileAdapter : Appliance, ITarget {
    public Voltage GetMobileVoltage() {
        var voltage = GetVoltage();
        Console.WriteLine($"Appliance voltage is {voltage.Value}V!");
        voltage.Value = 3;
        Console.WriteLine($"After adapted,it becomes {voltage.Value}V!");
        return voltage;
    }
}

手机适配器MobileAdapter类,继承自Applicance家用电器并实现ITarget接口。

对象的适配器模式

namespace AdapterPattern.ObjectBased
public class Adaptee {
    public void OriginalMethod() {
        Console.WriteLine("Original Method is being called!");
    }
}

适配者Adaptee类,这是将要被我们适配的类。

public interface ITarget {
    void TargetMethod();
}

目标接口ITarget,定义我们的目标动作。

public class Target : ITarget {
    public virtual void TargetMethod() {
        Console.WriteLine("Target Method is being called!");
    }
}

目标Target类,实现目标接口以实现动作。

public class Adapter : Target {
    private Adaptee _adaptee = new Adaptee();
    public override void TargetMethod() {
        _adaptee.OriginalMethod();
    }
}

适配器Adapter类,继承自Target类。内部维持对适配者的引用并实现一个目标动作。

public class Program {
    private static ClassBased.ITarget _targetClass = null;
    private static ObjectBased.ITarget _targetObject = null;
    public static void Main(string[] args) {
        //Class Pattern
        _targetClass = new ClassBased.MobileAdapter();
        var voltage = _targetClass.GetMobileVoltage();
        Console.WriteLine("-----------------------------");
        //Object Pattern
        _targetObject = new ObjectBased.Adapter();
        _targetObject.TargetMethod();
        Console.ReadKey();
    }
}

以上是调用方的代码,分别演示了类的适配器模式和对象的适配器模式的用法。以下是这2个案例的输出结果:

Appliance voltage is 220V!
After adapted,it becomes 3V!
-----------------------------
Original Method is being called!

总结

优点

1、可以让任何两个没有关联的类一起运行;

2、可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”;

3、增加了类的透明度和更好的灵活性。


缺点

1、由于C#不支持多重继承,所以最多只能适配一个适配者类,而且目标类必须是抽象类;

2、采用了类和接口的“双继承”实现方式,带来了不良的高耦合。


使用场景

1、系统需要复用现有类,而该类的接口不符合系统的需求;

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

3、对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。


相关文章
|
3月前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
2月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
51 0
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
5月前
|
设计模式 Go 数据处理
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
|
5月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 适配器模式
js设计模式【详解】—— 适配器模式
37 0
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###