C#设计模式之6-适配器模式
适配器模式(Adapter Pattern)
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/399 访问。
适配器模式属于结构型模式,把一个类的接口变成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
适配器模式又可以分为4种类型,类适配器模式、对象适配器模式、单接口适配器模式(缺省适配器模式)和双向适配器模式。后2种模式的实现比较复杂并且在实际开发过程中很少使用,故本博文只讨论前2种模式。
角色:
1、抽象目标(Target)
抽象目标类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于C#语言不支持多重继承,所以它只能是接口;
2、适配器(Adapter)
它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,它是适配器模式的核心;
3、适配者(Adaptee)
适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。
示例:
命名空间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!
优点:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/399 访问。
1、可以让任何两个没有关联的类一起运行;
2、可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”;
3、增加了类的透明度和更好的灵活性。
缺点:
1、由于C#不支持多重继承,所以最多只能适配一个适配者类,而且目标类必须是抽象类;
2、采用了类和接口的“双继承”实现方式,带来了不良的高耦合。
使用场景:
1、系统需要复用现有类,而该类的接口不符合系统的需求;
2、想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作;
3、对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
C#设计模式之6-适配器模式的更多相关文章
- 设计模式 结构型 - 适配器模式 Adapter
Adapter(适配器模式) ---- 加个“适配器”以便于复用 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景 如果 ...
- Java设计模式7:适配器模式
适配器模式 适配器模式说的是,可以把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类可以一起工作. 适配器模式的用途 适配器模式的用途,在网上找了一幅图,挺形象 ...
- 设计模式学习之适配器模式(Adapter,结构型模式)(14)
参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...
- 【读书笔记】读《JavaScript设计模式》之适配器模式
一.定义 适配器模式可用来在现有接口和不兼容的类之间进行匹配.使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象.在设计类的时候旺旺会遇到有些接口不能与现有API ...
- IOS设计模式之三(适配器模式,观察者模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- Java设计模式系列之适配器模式
适配器模式的定义 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.(就类似于我们充电器的转接头将220V的电压转换成我们的手机端 ...
- java设计模式笔记(1)-适配器模式
适配器的定义 适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口.比如:电源适配器.三角架基座转接部件.USB与串口的转接设备等. ...
- Java程序设计模式系列之适配器模式
理解适配器设计模式需要从生活中的场景进行联系,在生活当中有那些东西能够称为适配器呢?从字面上理解,"适配"的意思就是让一个东西和另一个东西配对,能够让他们一起工作,比如大家用的笔记 ...
- Java设计模式学习记录-适配器模式
前言 之前已经将五个创建型设计模式介绍完了,从这一篇开始介绍结构型设计模式,适配器模式就是结构型模式的一种,适配器要实现的效果是把“源”过渡到“目标”. 适配器模式 在开发过程中,使用一个已经存在的类 ...
- 设计模式入门,适配器模式,c++代码实现
// test07.cpp : Defines the entry point for the console application.// #include "stdafx.h" ...
随机推荐
- day2 python六大标准数据类型简介
1.number( int , float , bool , complex ) # int 整型 intvar = 2020 print(type(intvar),id(intvar)) # f ...
- Linux find 查找 并删除文件 杀掉进程
find 默认在当前 即 . 目录下查找 du 文件名 / 目录 # 查看文件占用内存大小 1. 按照文件名查找 find / -name qwe # qwe为文件名 find / -name *qw ...
- 工作用不到,面试经常问,这么头疼的Spring,怎么能快速过关
目录 这次文章很简单,但是也不简单,spring,spring的IOC和AOP,不知道你掌握的怎么样,最近身边的朋友有木有去面试的?他们被问到的spring面试题你能回答吗? 一看这张图,可能有朋友会 ...
- 老司机带你玩转面试(5):Redis 集群模式 Redis Cluster
前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...
- django-rest-framework-源码解析002-序列化/请求模块/响应模块/异常处理模块/渲染模块/十大接口
简介 当我们使用django-rest-framework框架时, 项目必定是前后端分离的, 那么前后端进行数据交互时, 常见的数据类型就是xml和json(现在主流的是json), 这里就需要我们d ...
- Java基础之函数
函数(方法)的定义: 函数就是定义在类中的具有特定功能的一段独立的小程序. 为什么有函数:为了提高代码的复用性,对独立代码进行抽取,把抽取部分代码部分,定义成一个独立的功能,方便日后使用.Java中对 ...
- ~~网络编程(三):TCP/UDP~~
进击のpython ***** 网络编程--TCP/UDP协议 其实你也发现了,应用层是交给应用来处理的,我们什么也做不了 相较于网络编程来说,我们更重要的是在做应用层和传输层的对接 因为你也看到了, ...
- C#中子类对基类方法的继承、重写和隐藏
提起子类.基类和方法继承这些概念,肯定大家都非常熟悉.毕竟,作为一门支持OOP的语言,掌握子类.基类是学习C#的基础.不过,这些概念虽然简单,但是也有一些初学者可能会遇到的坑,我们一起看看吧. 子 ...
- java基础(十)--空指针异常
空指针异常即:java.lang.NUllPointException异常,主要用于在对象为null的情况下,调用对象的方法或对象的属性时会抛出. 举例说明: public class TestBas ...
- Lua学习入门(代码块)
). if then else if a < then b = else b = end ). if elseif else then if a < then b = elseif a = ...