C#学习笔记之适配器模式详解
作者:可达鸭要进化 发布时间:2021-06-16 14:10:50
什么是适配器模式?
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
什么时候运用适配器模式?
在想使用一个已经存在的类时,如果它的接口,也就是它的方法与我们当前的要求不相同时,就需要考虑用到适配器模式了。
一般而言,使用适配器模式是出于无奈之举,一般存在于软件开发后期或者维护期,在软件设计阶段,我们还是尽量避免该模式的使用。
适配器模式的组成
Target:目标接口,也就是客户所期待的接口。目标可以是具体的或者抽象的类,也可以是接口。
Adpatee:需要适配的类。也就是我们需要与目标接口对接成功的类。
Adapter:中间起到链接作用的类。通过在内部包装一个Adptee对象,将源接口转换成目标接口。
适配器模式具体实现
适配器模式的结构
适配器模式的实现
Target类:也就是目标类
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求");
}
}
Adaptee类:需要适配的类
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求");
}
}
Adapter类:
class Aapter : Target
{
private Adaptee adaptee = new Adaptee();
/// <summary>
/// 这样就可以把表面调用Request()方法变成实际调用SpecificRequest()
/// </summary>
public override void Request()
{
adaptee.SpecificRequest();
}
}
主函数调用:
static void Main(string[] args)
{
//对客户端来说,调用的是Target的Request()
Target target = new Aapter();
target.Request();
Console.Read();
}
实例解析
为了深化理解,我们准备一个具体的实例来分析。
姚明作为一个外籍的球员在进入NBA初期,由于英文水平一般,常常听不懂教练的指挥与安排,需要翻译来全程跟随以实现沟通。请就此来写出具体的情况。
分析:
在这里,我们不难发现教练的指挥与安排就是Target,姚明就是Adaptee,而翻译就理所当然成了Adapter,那么我们就能分析出彼此的关系了。
具体实现:
class Program
{
static void Main(string[] args)
{
Player b = new Forwards("A");
b.Attack();
Player m = new Guards("B");
m.Attack();
//通过翻译,姚明知道了需要做的事情
Player ym = new Translator("姚明");
ym.Attack();
ym.Defense();
Console.Read();
}
abstract class Player
{
protected string name;
public Player(string name)
{
this.name = name;
}
public abstract void Attack();
public abstract void Defense();
}
/// <summary>
/// 前锋
/// </summary>
class Forwards : Player
{
public Forwards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("前锋{0} 进攻", name);
}
public override void Defense()
{
Console.WriteLine("前锋{0} 防守", name);
}
}
/// <summary>
/// 中锋
/// </summary>
class Center : Player
{
public Center(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("中锋{0} 进攻", name);
}
public override void Defense()
{
Console.WriteLine("中锋{0} 防守", name);
}
}
/// <summary>
/// 后卫
/// </summary>
class Guards : Player
{
public Guards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("后卫{0} 进攻", name);
}
public override void Defense()
{
Console.WriteLine("后卫{0} 防守", name);
}
}
/// <summary>
/// 翻译是继承于运动员的,因为他需要直接理解教练的意思
/// 但是他实际需要传达的是外籍球员,所以他调用的是外籍球员所理解的方法=>也就是翻译的作用
/// </summary>
class Translator : Player
{
private ForeignCenter fc = new ForeignCenter();
public Translator(string name) : base(name)
{
fc.Name = name;
}
public override void Attack()
{
fc.进攻();
}
public override void Defense()
{
fc.防守();
}
}
/// <summary>
/// 作为外籍球员,他有自己的姓名和进攻防守方式等
/// 其他的事情交给翻译就好了
/// </summary>
class ForeignCenter
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public void 进攻()
{
Console.WriteLine("外籍中锋{0} 进攻", name);
}
public void 防守()
{
Console.WriteLine("外籍中锋{0} 防守", name);
}
}
}
适配器模式的优缺点
像之前提到的适配器能在后期维护的时候起到很大的作用,能在开发新的功能的时候保护原来软件的稳定性,但是初期的时候还是能避免就尽量避免吧!
备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。
来源:http://www.cnblogs.com/Aries-rong/archive/2017/11/15/7837972.html
猜你喜欢
- 并发编程中的三个概念:1.原子性在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执
- 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session共享问题,但是在分布式/集群项目中,Session 共享则是一个必
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工
- Java 8 Instant 时间戳用于“时间戳”的运算。它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经
- 目录概述非阻塞算法依赖JCTools队列队列实现原子队列容量其他数据结构工具性能测试使用JCTools的缺点结论概述在本文中,我们将介绍JC
- 利用TCP传输数据,编写客户端和服务器的程序,实现两个程序间的实时通信。在每个程序中实现了实时的发送与接收数据的功能。客户端的io界面服务器
- mybatis-spring:@MapperScan注解在demo: springboot+mybatis的示例中,dao层接口使用了注解@
- 本文实例为大家分享了java实现小超市程序的具体代码,供大家参考,具体内容如下一.人物包1.顾客类package person;public
- 一、返回值格式统一1.返回值介绍在使用controller对外提供服务的时候,很多时候都需要统一返回值格式,例如{"status&
- 通过GitHub获取Eureka源码进入git bash命令行,自己找个目录,用来存放eureka源码,然后在目录里面,执行git clon
- Android Handler移除Message详解问题:1.removeMessage(what)函数是否只能移除对应what值的Mess
- 自定义对象作为HashMap的Key这个问题在很多面试者面试时都会被提及,本人也是最近在看effective java第九条:覆盖equal
- 本文实例讲述了C#编程获取客户端计算机硬件及系统信息功能。分享给大家供大家参考,具体如下:这里使用C#获取客户端计算机硬件及系统信息 ,包括
- 本文实例讲述了ActiveMQ在C#中的应用。分享给大家供大家参考,具体如下:ActiveMQ是个好东东,不必多说。ActiveMQ提供多种
- 本文实例为大家分享了JavaSE实现猜拳游戏的具体代码,供大家参考,具体内容如下import java.util.Random;import
- 前言Windows 11下所有控件已经默认采用圆角,其效果更好、相对有着更好的优化,只是这是默认的行为,无法进一步自定义。圆角按钮实现【重写
- 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过注解@PostConstruct 和 @
- intellj idea的强大之处就不多说了,相信每个用过它的人都会体会到,但是我们也会被他的复杂搞的晕头转向,尤其刚从eclipse转过来
- MultipartResolver和ServletFileUpload冲突如果同时使用了MultipartResolver 和Servlet
- 一、概述我们知道,当我们对es发起search请求或其他操作时,往往都是随机选择一个coordinator发起请求。而这请求,可能是该节点能