适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
类图:
用最直白的话说就是:正写着ClassA的代码的时候发现我要实现的功能很大一部分都在ClassB里已经实现了。那好直接拿着来用呗。但别人调用的时候要的是ClassA不是ClassB啊,当然你的设计不是那么僵化的话需要的会是IClassA。那行你不是要IClassA吗,ClassA实现IClassA接下来重复的代码就不写了,把工作都委托给ClassB吧。
鸭子接口
野鸭
火鸡接口
野火鸡
鸭子适配器
有一天你老爹更跟你说:“儿啊,爹现在很无聊想听听鸟叫”。你马上犯难了,家鸡好找,野鸟难求啊。诶,隔壁王二家不是昨天买了只火鸡吗。但可火鸡也不是鸟啊。
不过经过你一番思考,经过你那天马行空高度抽象的思维,把火鸡修剪修剪羽毛,吃点润喉片就适配成鸟了(其实到底是不是无所谓啦,关键是你老爹认就行,他这个编译器不给你报个错:"类型不匹配"就一切OK!)。
另外补充一点对继承和实现接口的看法。继承什么说明是什么,实现什么说明能看成什么(能当什么用)。比如说你继承了人这个类那你本质上就是一个人。你实现了律师接口,就是说国家(编译器)承认你的律师资格,人家可以把你当律师来用。接口就是发给一个类的资格证。
适配器有两种实现方式,上面的这种是对象适配器。还有一种类适配器。使用对象适配器的时候我们会发现,一个接口非常大的话,我们会比较郁闷。虽然是委托给别人做但是一百个方法也得委托一百次啊。要是能用继承多好啊,该重写的重写,不要重写的用原有的,不要去实现一个接口里几百个方法。比若说我用一个类继承野鸭,同时继承野火鸡,这样既是野鸭也是火鸡了。可惜java,c#之类的语言不能实现,用不到,就只能当长长见识了。
类图:
用最直白的话说就是:正写着ClassA的代码的时候发现我要实现的功能很大一部分都在ClassB里已经实现了。那好直接拿着来用呗。但别人调用的时候要的是ClassA不是ClassB啊,当然你的设计不是那么僵化的话需要的会是IClassA。那行你不是要IClassA吗,ClassA实现IClassA接下来重复的代码就不写了,把工作都委托给ClassB吧。
鸭子接口
public interface Duck
{
string Quack();
string Fly();
}
{
string Quack();
string Fly();
}
野鸭
public class MallardDuck : Duck
{
public MallardDuck()
{}
Duck Members
}
{
public MallardDuck()
{}
Duck Members
}
火鸡接口
public interface Turkey
{
string Gobble();
string Fly();
}
{
string Gobble();
string Fly();
}
野火鸡
public class WildTurkey : Turkey
{
public WildTurkey()
{}
Turkey Members
}
{
public WildTurkey()
{}
Turkey Members
}
鸭子适配器
public class DuckAdapter : Turkey
{
Duck duck;
public DuckAdapter(Duck duck)
{
this.duck = duck;
}
Turkey Members
}
{
Duck duck;
public DuckAdapter(Duck duck)
{
this.duck = duck;
}
Turkey Members
}
有一天你老爹更跟你说:“儿啊,爹现在很无聊想听听鸟叫”。你马上犯难了,家鸡好找,野鸟难求啊。诶,隔壁王二家不是昨天买了只火鸡吗。但可火鸡也不是鸟啊。
不过经过你一番思考,经过你那天马行空高度抽象的思维,把火鸡修剪修剪羽毛,吃点润喉片就适配成鸟了(其实到底是不是无所谓啦,关键是你老爹认就行,他这个编译器不给你报个错:"类型不匹配"就一切OK!)。
另外补充一点对继承和实现接口的看法。继承什么说明是什么,实现什么说明能看成什么(能当什么用)。比如说你继承了人这个类那你本质上就是一个人。你实现了律师接口,就是说国家(编译器)承认你的律师资格,人家可以把你当律师来用。接口就是发给一个类的资格证。
适配器有两种实现方式,上面的这种是对象适配器。还有一种类适配器。使用对象适配器的时候我们会发现,一个接口非常大的话,我们会比较郁闷。虽然是委托给别人做但是一百个方法也得委托一百次啊。要是能用继承多好啊,该重写的重写,不要重写的用原有的,不要去实现一个接口里几百个方法。比若说我用一个类继承野鸭,同时继承野火鸡,这样既是野鸭也是火鸡了。可惜java,c#之类的语言不能实现,用不到,就只能当长长见识了。