通俗易懂设计模式解析——适配器模式

前言

  前面完成了创建型的设计模式的分享,创建型的设计模式解决的是对象创建的问题。今天开始介绍结构型的设计模式,其中结构型设计模式包括:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。结构型设计模式解决的是类与对象的组合关系。今天讲结构型对象中的第一个——适配器模式。适配器模式——顾名思义嘛。在我们平常的理解中,适配器是干啥用的呢?不就是将两个原本不匹配的东西转换为匹配罢了。适配器是接口转换器,比如电源适配器,USB接口转换器等等。

适配器模式介绍

一、来由

  在系统程序中,我们可能会面临需求的增加或者改变,或者是应用环境的改变。常常需要将一些已经存在的类放在新的需求或者新的环境中应用。但是新的环境要求使用到的接口与现在存在的类或对象不完全匹配。那么如何去面对这样的迁移变化呢?

二、意图

  将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。   

三、案例图

四、适配器模式代码示例

  在适配器模式中一般包含以下部分的存在:

客户端:与目标接口配合协同使用

目标接口:与客户端协同使用

被适配角色:表示一个已经存在了并使用的接口

适配器:整个模式核心存在,将被适配角色转换为目标需要的接口。

  接下来我们看下这个示例,前段时间笔记本那个耳机圆孔接口坏掉了。这个时候我只有手机那种圆孔耳机。但是我也需要在电脑上面使用,那怎么办呢?我不想多花钱去买一个usb耳机,也没有时间去把电脑修好。简单、我去网上买一个耳机的Usb转换器。然后就可以在电脑上使用了。在这事例中,目标接口是电脑USB耳机,被适配角色是手机圆孔耳机,适配器就是圆孔耳机转换为USB的过程、电脑则是客户端:

namespace Adapter_Pattern
{
    class AdapterPattern
    {
    }
    #region 目标角色——需要电脑usb耳机=========================
    /// <summary>
    /// 客户端需要的接口
    /// </summary>
    interface ComputerHeadsetTarget
    {
         void GetComputerHeadset();
    }
    #endregion

    #region 被适配角色——现在存在的手机耳机=====================
    /// <summary>
    /// 目前已经存在的接口
    /// </summary>
    public class Adaptee
    {
        public void PhoneHeadset()
        {
            Console.WriteLine("我现在拥有的是手机耳机。");
        }
    }
    #endregion

    #region 对象适配器——将手机耳机转换成电脑需要的usb耳机==========
    /// <summary>
    /// 对象适配器实现
    /// </summary>
    public class ObjectAdapter : ComputerHeadsetTarget
    {
        Adaptee Adaptee = new Adaptee();
        public void GetComputerHeadset()
        {
            Adaptee.PhoneHeadset();
            Console.WriteLine("现在加入耳机Usb转换器");
            Console.WriteLine("输出:电脑使用的usb耳机");
        }
    }
    #endregion

    #region 类适配器——将手机耳机转换成电脑需要的usb耳机===========
    /// <summary>
    /// 类适配器的实现
    /// </summary>
    public class ClassAdapter : Adaptee,ComputerHeadsetTarget
    {
        public void GetComputerHeadset()
        {
            this.PhoneHeadset();
            Console.WriteLine("现在加入耳机Usb转换器");
            Console.WriteLine("输出:电脑使用的usb耳机");
        }
    }
    #endregion
}
  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("我现在需要电脑usb耳机");
            ///对象适配器
            ObjectAdapter objectAdapter = new ObjectAdapter();
            objectAdapter.GetComputerHeadset();

            Console.WriteLine("我现在需要电脑usb耳机");
            ///类适配器
            ClassAdapter classAdapter = new ClassAdapter();
            classAdapter.GetComputerHeadset();

            Console.ReadLine();
        }
    }

使用场景及优缺点

  这适配器模式主要用于一些希望被复用的类,但是这些类中的接口又与新的环境不完全匹配的情况下。老代码遗留修改中、类库迁移中用处较多。

  在上面示例中写了适配器的两种实现方式,对象适配器和类适配器。对于类适配器来说既继承了目标接口类又继承了已存在接口类。在C#编程中尽量采用多组合少继承的形式进行代码编写。多继承提高了类之间的耦合性。所以对于类适配器一般情况尽量少使用。而对于对象适配器来说采用的是对象组合的方式。

一、使用场景

1、系统需要复用现在的类,但是类中接口与现在环境不完全匹配

2、想要建立一个可以复用的类,用于彼此之间没有太大关联的一些类。

二、优点

对象适配器:

1、可以再不修改原来的类的基础上复用原来的类,符合开闭原则

2、采用的”对象组合”,降低类之间的耦合性

类适配器:

1、可以再不修改原来的类的基础上复用原来的类,符合开闭原则

2、可以重新定义被适配角色类中一部分行为,在类适配器中被适配角色类为基类

3、仅是引用一个对象,不需要额外的字段引用实例

三、缺点

对象适配器:

1、重新定义被适配角色类中部分行为困难

类适配器:

1、对于被适配角色类的子类中的一些方法就不能进行转换了,因为没有引用其实例,仅继承基类。所以只能调用基类中的方法。

2、采用了多继承的方式。提高了类之间的耦合性

总结

  大家会不会觉得Adapter这个单词这么熟悉呢?我刚看的时候也觉得蛮熟悉的样子。应该大多数人都写过DBHelper这个数据库辅助类吧,在数据库连接操作过程中存在着DataSet对象和DataAdaper对象。DataAdaper也就是数据适配器,负责把DataSet与真实数据源连接起来。DataAdaper获得数据,然后将数据填充到DataSet对象中。针对于数据库与DataSet之间的一种适配。这也是.NET中一种适配器模式的实现。

 天再高又怎样,踮起脚尖就更接近阳光。

    C#设计模式系列目录

欢迎大家扫描下方二维码,和我一起踏上设计模式的闯关之路吧!

  

原文地址:https://www.cnblogs.com/hulizhong/p/11436206.html

时间: 2024-08-01 13:34:25

通俗易懂设计模式解析——适配器模式的相关文章

通俗易懂设计模式解析

前言 今天我们看的是访问者模式[Visitor Pattern ],我们理解访问者模式这个名称可能会有利于我们理解其核心代码块.我们看这么个例子:我去朋友家做客,那么朋友属于主人,我则属于访问者.这时刚好朋友在炒菜,却没得酱油了.如果朋友下去买酱油将会很麻烦而且会影响炒菜.这时就到我这个访问者出马了.一溜烟的出去打着酱油就回来了.简单理解的来说就是,访问者在主人原来的基础上帮助主人去完成主人不方便或者完不成的东西. 回到顶部 访问者模式介绍 一.来由 在软件系统开发中,我们经常会遇见一些层次结构

研磨设计模式解析及python代码实现——(三)适配器模式(Adapter)

一.适配器模式定义 将一个类的接口转换成另外一个接口,适配器模式使得原本由于接口不兼容,而不能在一起工作的哪些类能够在一起工作. 二.python 实现 1 import string 2 import cPickle as p 3 import datetime 4 import os 5 class LogModel: 6 logId="" 7 operateUser="" 8 operateTime="" 9 logContent=&quo

Retrofit源码设计模式解析(下)

本文将接着<Retrofit源码设计模式解析(上)>,继续分享以下设计模式在Retrofit中的应用: 适配器模式 策略模式 观察者模式 单例模式 原型模式 享元模式 一.适配器模式 在上篇说明CallAdapter.Factory使用工厂模式时,提到CallAdapter本身采用了适配器模式.适配器模式将一个接口转换成客户端希望的另一个接口,使接口本不兼容的类可以一起工作. Call接口是Retrofit内置的发送请求给服务器并且返回响应体的调用接口,包括同步.异步请求,查询.取消.复制等功

Head First 设计模式之适配器模式与外观模式

Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计中将类的接口转化为想要的接口,以实现同的接口,此外还将讲述另一个模式,将对象包装起来以简化接口. 1.   适配器简介 1.1 面向对象的适配器 真实世界的适配器比如位于美式插头和欧式插座之间的交流电适配器.面向对象的适配器是什么呢? 面向对象的适配器是将一个接口转化成另一个接口,以符合客户的期望.

《Android源码设计模式解析》读书笔记——Android中你应该知道的设计模式

断断续续的,<Android源码设计模式解析>也看了一遍,书中提到了很多的设计模式,但是有部分在开发中见到的几率很小,所以掌握不了也没有太大影响. 我觉得这本书的最大价值有两点,一个是从设计模式的角度去理解Android源码,结合着日常开发中的常用类,对设计模式的理解会更加的深刻:另外一个好处就是了解常用模式,再看其他人写的代码的时候,更容易理解代码思路.下面是我的读书笔记和一些思考,设计模式只整理我认为重要的部分. 建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

研磨设计模式解析及python代码实现——(一)简单工厂模式

最近在学设计模式,正巧书之前学了些python,但用的还不是很成熟.<研磨设计模式>书上只给了java代码,本着以练手为目标,我照着书上打了一遍java代码,在仔细体会其思想后,将其写成了python的代码.有不对的地方希望各位批评指正~ 具体原理不多做介绍,具体可以参考http://chjavach.iteye.com的博客,或者<研磨设计模式>的书. 一.背景介绍 接口思想: 众所周知,面向对象语言最大的特点便是封装,继承,多态这三个概念.而像Java等面向对象语言最核心的思想

设计模式之适配器模式

适配器模式(Adapter Pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类别自己的接口包裹在一个已存在的类中. Adapter Pattern有两种: 类的Adapter Pattern(继承) 对象的Adapter Pattern(委托) 下面我们用第一种来实现适配器模式: 我们首先来看看类图: 具体实现如下: Banner类: public class Banner { private Stri

设计模式之适配器模式(Adapter Pattern)

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 1. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 模式中的角色 2.1 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 2.2 需要适配的类(Adaptee):需要适配的类或适配者类. 2.3 适配器(Adapter):通过包装一个需要适配的对象,把