版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lrtcsdn/article/details/82729159
结构型——适配器模式Adapter
定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。
适配器类型:类适配器模式和对象适配器模式。这里主要讲解对象适配器模式
举个栗子
在多元化的发展下,我们的语言也是多种多样,当我们和外国人交流时互相都听不懂该怎么办呢?为了顺应时代的发展这时候就了翻译,大家就可以愉快的交流了,在设计模式书中讲到姚明去NBA打球和队友交流用到翻译的,这里我们还用此例来说。
Adeptee(被适配类)ForeigCenter
Adepter(适配器)Player
Target(适配类)Translator
abstract class Player
{
protected string name;
public Player(string name)
{
this.name = name;
}
//进攻防守的方法
public abstract void Attact();
public abstract void Defenst();
}
class Translator:Player
{
//声明并实例化一个内部“外籍中锋”对象,表明翻译者与外籍球员有关系
private ForeignCenter wjzf = new ForeignCenter();
public Translator(string name)
: base(name)
{
wjzf.Name = name;
}
//翻译者将“Attact”翻译为“进攻”告诉外籍中锋
public override void Attact()
{
wjzf.进攻();
}
public override void Defenst()
{
wjzf .防守 ();
}
}
客户端代码:姚明需要适配器告诉自己要做什么,这里的接口代表方法或方法的集合。(客户端代码可以统一调用统一接口,这样更简单、更直接、更紧凑。)
class Program
{
static void Main(string[] args)
{
Player b = new Forwards("巴蒂尔");
b.Attact();
Player m = new Guards("麦克格雷迪");
m.Attact();
//翻译告诉姚明,防守和进攻
Player ym = new Translator("姚明");
ym.Attact();
ym.Defenst();
Console.Read();
}
}
使用范围:系统的数据和行为都正确,但接口不符合时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。两个类做相同或相似的事情,但是具有不同的接口时用适配器模式
优点:增加了类的复用性,在不修改源代码的基础上来复用现有类,符合“开闭原则”
缺点:使重定义Adaptee行为困难,需要生成Adaptee的子类并且使用Adapter引用这个子类而不是引用Adaptee