0.DP
-
类适配器和对象适配器的比较
类适配器:
无法用这个具体的Adapter类为Adaptee的子类提供适配。
Adapter可以重定义继承自Adaptee中的操作。对象适配器:
一个Adapter类就可以为Adaptee及其子类提供适配。
不能重定义Adaptee中的操作。
1.问题
问题:姚明在NBA技术交流没问题,但是语言沟通需要翻译–翻译即为适配器。
在软件开发中,也就是系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口 又与复用环境要求不一致的情况
2.定义
适配器模式(Adapter),将一个类的接口转换成客户希望的另 外一个接口。Adapter模式使得原本由于接口不兼容而不能一 起工作的那些类可以一起工作。
- 两种适配器类型:类适配器模式(通过多重继承,让两个接口进行匹配,许多语言如C# java都不支持)和对象适配器模式
3.结构图和代码
类适配器:
对象适配器:【以此为主】
代码
//Target:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求!");
}
}
//Adaptee:需要适配的类
class Adaptee
{
public static void SpecialReqest()
{
Console.WriteLine("特殊请求!")
}
}
//Adapter(通过在内部包装一个Adaptee对象,把源接口转换成目标接口)
class Adapter extends Target
{
private Adaptee adaptee =new Adaptee();//建立一个私有的被适配类
@override
public static void Request()
{
adaptee.SpecificRequest();//这样就可以把表面上调用Request()方法变成实际调用SpecificRequest()
}
}
//客户端代码
static void Main(String[] args[])
{
Target tatget=new Adapter();
target.Request();
Console.Read();
}
-
使用的场景:
-
要在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同时就使用它。有不同首先应该考虑统一接口。
-
但也有在开发的设计阶段,就考虑用适配器模式来解决接口不同的问题。比如公司设计一系统时考虑使用第三方开发组件,而这个组件的接口与我们自己的系统接口是不相同的,而我们也完全没有必要为了迎合它而改动自己的接口。
-
-
应用举例
在姚明打球的问题中,前锋、中锋、后卫都继承球员这个抽象类,实现Attack和Defense方法,姚明也有这两个方法,但听不懂这是什么,所以需要翻译者引用外籍中锋(在代码中,引种即为声明一个private的类型变量)代码:
//球员 abstract class Player { protected String name; public Player(String name) { this.name=name; } public abstract void Attack(); public abstract void Defense(); }
//外籍中锋 class ForeignCenter { private String name; public String Name; { public void get() { return name; } public void set(String name) { this.name=name; } } public abstract void 进攻() { Console.WriteLIne("外籍中锋{0}进攻,name"); } public abstract void Defense() { Console.WriteLIne("外籍中锋{0}防守,name"); } }
//翻译者,继承Player class Translator implements Player { private ForeignCenter wgr=new ForeignCenter(); @overrid public Translator(String name) { wgr.Name=name; } public abstract void Attack() { wgr.进攻(); } public abstract void Defense() { wgr.防守(); } }
//客户端 static void main(String[] args[]) { Player p=new Translator("姚明"); p.Attack(); p.Defense();//实现了从进攻、防守到Attack、Defense的转变 }