• 适配器模式概述

定义:将一个类的接口转化成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作。别名(包装器[Wrapper]模式)

它属于创建型模式的成员,何为创建型模式就是关注如何将现有类或对象组织在一起形成更大的结构。由于系统中存在类和对象,所以存在两种结构型模式:类结构型模式(关注类的组合,由多个类组成一个更大的系统,一般只有继承关系和实现关系)对象结构型模式(关注类和对象的组合,通过关联关系,在一个类中定义另一个类的对象,然后通过该对象调用相关方法)

适配器,适配器,笔记本要用的就是电源适配器(AC Adapter),没错,有了电源适配器,我们笔记本就能使用本来不能使用的220V的电压了,这也就是电源适配器的功劳。我们这里也一样,引入适配器模式以兼容某些结构。

  • 适配器模式的结构

结构:

  1. Target(目标抽象类):它定义客户所需的接口(能用的电压),可以是abstract类或接口,也可以是具体类。在类适配器中,只能是接口(单继承)
  2. Adapter(适配器类):可调用另一个接口,作为转化器。,对Adaptee和Target进行适配,相当于电源适配器。类适配中实现Target接口并继承Adaptee来实现产生关系,在对象适配器中,继承Targer并关联Adaptee对象产生联系(如上图)
  3. Adaptee(适配者类):它是被适配的,定义一个已存在的接口,相当于220V电压。一般是一个具体类(有了才能去适配)。

简单分析:

上图是课上老师给的例子,这样理解起来就很容易了。伪装者即适配器类,由于要用到鸭子的方法,所以用火鸡伪装下,它关联鸭子,就可以在内部生成鸭子的对象。即披着鸭子皮的火鸡,让小朋友们误以为是鸭子在表演。

  • 缺省适配器模式(Default Adapter Pattern)

定义:缺当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。

结构:

  1. ServiceInterface(适配者接口):在该接口中声明许多方法
  2. AbstractServiceClass(缺省适配器类):核心类,使用空方法实现ServiceInteface中的方法,对它实例化无意义
  3. ConcrServiceClass(具体业务类):缺省适配器类的子类,直接继承适配器类,根据需要有选择性的实现上述中的某个方法
  • 双向适配器

适配器中同时包含对目标类和适配器类的引用,适配者可以通过调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,该适配器即双向适配器


结构:

 public class Adapter : Target, Adaptee
{
//同时维持对抽象目标类和适配者的引用
private Target target;
private Adaptee adaptee; public Adapter(Target target)
{
this.target = target;
} public Adapter(Adaptee adaptee)
{
this.adaptee = adaptee;
} public void Request()
{
adaptee.SpecificRequest();
} public void SpecificRequest()
{
target.Request();
}
}

应用:实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫(Cry()),狗可以学猫捉老鼠(CatchMouse())

实现:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 适配器模式
{
public interface IDog
{
void Action();
void Wang();
} public interface ICat
{
void Cry();
void CatchMouse();
} public class Snoopy : IDog
{
public void Action()
{
} public void Wang()
{
Console.WriteLine("汪汪的叫.......");
}
} public class Tom : ICat
{
public void Cry()
{
} public void CatchMouse()
{
Console.WriteLine("捉老鼠.....");
}
} public class Adapter : ICat, IDog
{
private IDog dog;
private ICat cat; public Adapter(IDog d)
{
this.dog = d;
} public Adapter(ICat c)
{
this.cat = c;
} public void Cry()
{
dog.Wang();
} public void CatchMouse()
{
cat.CatchMouse();
} public void Action()
{
cat.CatchMouse();
} public void Wang()
{
dog.Wang();
}
} class Program
{
static void Main(string[] args)
{
//这里猫想学狗叫,实现Cry的方法,所以适配者首先是一只猫,它要实现猫的Cry的方法,
//但适配者是假的,它只能借助狗的方法来实现。
ICat cat = new Adapter(new Snoopy());
Console.Write("Cat learn:");
cat.Cry();
Console.Read();
}
} }
  • 适配器模式的优点

  1. 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构
  2. 增加了类的透明性和复用性,提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用
  3. 灵活性和扩展性非常好
  4. 类适配器模式:置换一些适配者的方法很方便
  5. 对象适配器模式:可以把多个不同的适配者适配到同一个目标,还可以适配一个适配者的子类
  • 适配器模式的缺点

  • 类适配器模式
  1. 一次最多只能适配一个适配者类,不能同时适配多个适配者
  2. 适配者类不能为最终类
  3. 目标抽象类只能为接口,不能为类
  • 对象适配器模式
  1. 对象适配器模式:在适配器中置换适配者类的某些方法比较麻烦
  • 适配器模式的适用环境

  1. 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
  2. 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作

适配器模式(Adapter Pattern)的更多相关文章

  1. 二十四种设计模式:适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...

  2. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  3. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  4. 【设计模式】适配器模式 Adapter Pattern

    适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...

  5. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  6. 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

    适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...

  7. 设计模式系列之适配器模式(Adapter Pattern)——不兼容结构的协调

    模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...

  8. 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)

    在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...

  9. 七个结构模式之适配器模式(Adapter Pattern)

    定义: 将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern). 结构图: Target:目标抽象类,客户所需要的接口. Adapt ...

随机推荐

  1. vue组件的生命周期

    先来张组件生命周期的示意图: 文档里是这样描述的:你不需要立马弄明白所有的东西,不过以后它会有帮助.传送门. Vue2.0的生命周期钩子一共有10个,同样结合官方文档作出了下表 生命周期钩子 详细 b ...

  2. servlet简介及生命周期

    Servlet 简介 Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上 ...

  3. element-ui bug及解决方案

    1.element-ui 使用MessageBox后弹窗显示异常 解决方案:去掉Vue.use(MessageBox); 2.element-ui 分页切换后若改变总数会导致请求两次 解决方案:< ...

  4. mybatis查询异常-Error querying database. Cause: java.lang.ClassCastException: org.apache.ibatis.executor.ExecutionPlaceholder cannot be cast to java.util.List

    背景,mybatis查询的时候直接取的sqlsession,没有包装成SqlSessionTemplate,没有走spring提供的代理. 然后我写的获取sqlsession的代码没有考虑到并发的情况 ...

  5. float的范围和有效位

    首先说一下: 范围是3.4E-38 ——3.4E+38,可提供7位有效数字. 上述这两个量都是近似值,各个编译器不太一样的. 下面我就将标准值是怎么定义的,和你说一下: 这个比较复杂,建议你找一下IE ...

  6. JSONUtils.toJSONString的一个坑

    JSONUtils.toJSONString(null); //返回一个为"null"的字符串 这样会导致一个结果就是StringUtils.isBlank判断后,会为false ...

  7. Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...

  8. Python爬虫利器五之Selenium的用法

    1.简介 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的 ...

  9. 安装Navicat for MySQL

    注: 以下内容引自 https://www.cnblogs.com/da19951208/p/6403607.html Navicat for MySQL下载.安装与破解   一:下载Navicat ...

  10. 前端BUG监控神器

    有时候,看到用户的反馈,我们往往会一脸茫然,因为反馈的信息太少了. 比如有用户反馈登录不了.为了解这个问题,一般的流程是这样的:首先试试自己能不能登录网站,发现没问题:然后查看后台日志,发现最近没有登 ...