适配器模式就是将2个物理上没有关系(不存在继承,或者存在同一个父类)的对象连接起来。
但是这2个对象逻辑上又是存在一定关联的,包含的方法的都一样。
class A{
public void Fun1();
public void Fun2();
}
class B{
public void Fun1();
public void Fun2();
}
上述A,B两个独立的类,不存在任何关系,但是他们的方法都是一样的,或者说方法名不同,但是作用是一样的。
适配器标准定义:
将一个类的接口转换成期望的另一个接口。
适配器模式分为2种
对象适配器:
场景:kfc原本是卖可口可乐的,但是刚好可口可乐卖完了,就需要用百事可乐来代替,但是又不能让顾客有明显的察觉。
先定义可口可乐的特征接口
public interface ICoca
{
//甜味
void Sweet();
//黑色的
void Black();
//会发出呲呲的声音
void Cici();
}
再定义一个百事可乐的特征接口
public interface IPepsi
{
//甜味
void Sweet();
//黑色的
void Black();
//会发出呲呲的声音
void Cici();
}
我们认为只要任何一种饮料符合上面3个特质,就可以认为他是可口可乐了,所以可以让百事来冒充可口可乐了。
所以接下来定义一个适配器
public class PepsiAdapter : ICoca
{
private readonly IPepsi _pepsi;
public PepsiAdapter(IPepsi pepsi)
{
_pepsi = pepsi;
}
public void Sweet()
{
_pepsi.Sweet();
}
public void Black()
{
_pepsi.Black();
}
public void Cici()
{
_pepsi.Cici();
}
}
这个PepsiAdapter继承于ICoca,表明可以建立这个PepsiAdapter类可以生成ICoca的类,在里面创建Pepsi类型,在各个方法里面调用对应的Pepsi方法,就可以是Coca和Pepsi类无缝衔接,效果就是我们任然调用着Coca的方法,但其实我们调用的是Pepsi的类。相当于虽然包装上写的是可口可乐,味道也是可口可乐的味道,但是实际上我们和的是百事可乐。
调用:
class Program
{
static void Main(string[] args)
{
//正常的coca调用
ICoca coca = new Coca();
coca.Black();
coca.Cici();
coca.Sweet();
//建立一个Pepsi对象
IPepsi pepsi = new Pepsi();
//用适配器将Pepsi转换从ICoca
ICoca pepsiAdapter = new PepsiAdapter(pepsi);
//像调用ICoca的方式去调用这个适配器,和调用Coca一样
pepsiAdapter.Black();
pepsiAdapter.Cici();
pepsiAdapter.Sweet();
Console.ReadLine();
}
}
然后封装一样调用的方法
class Program
{
static void Main(string[] args)
{
//正常的coca调用
ICoca coca = new Coca();
TestCoca(coca);
//建立一个Pepsi对象
IPepsi pepsi = new Pepsi();
//用适配器将Pepsi转换从ICoca
ICoca pepsiAdapter = new PepsiAdapter(pepsi);
//像调用ICoca的方式去调用这个适配器,和调用Coca一样
TestCoca(pepsiAdapter);
Console.ReadLine();
}
static void TestCoca(ICoca coca)
{
coca.Black();
coca.Cici();
coca.Sweet();
}
}
即完全可以像调用coca一样调用pepsi。
类适配器:
C#和Java都无法实现,只有能够支持多重继承的语言才能实现,例如C++.