鉴于自己学适配器模式时是从书本中一行行文字看下来,然后是各种UML图各种迷糊各种不懂各种不够直接的苦逼过程,现在自己想从“有需求->解决方法->总结成模式”的方式来说说个人对适配器模式的理解。
首先是需求(当然是main函数啦):
void main()
{
Target* client1 = new Target; //客户需求是制造USB口,我们自己有这技术,能够制造,所以设计了Target类来制造USB口
client1->make();
}
Target类:
class Target
{
public:
virtual ~Target(){}
virtual void make()
{
printf("制造USB口\n");
}
};
一段时间后,某个
客户2需求增加了,额外需要一个PS2口(并不是所有客户),所以main就变成了下面这样:
void main()
{
Target* client1 = new Target; //所有客户原来的需求只是制造USB口,我们自己能够制造,所以设计了Target类来制造USB口
client1->make();
//没想到,过了一段时间后,客户又要求需要制造PS2口的,而我们技术不够不能自己制造,
//于是,我们就只能引进Adaptee第三方库,但是客户只能用我们的Target类里的接口(这其中涉及到了版权等利益问题^_^)
//可是Target类的接口make()与Adaptee里的makePS2()不兼容,直接用make就只能生产USB,我们又不希望在Target类里添加makePS2()方法,
//因为别的很多只需要制造USB地方都用到了,所以我们不可能因为仅这个地方需要PS2口而去贸贸然修改Target类。
//怎么办?这时候就可以用适配器模式了:
//设计一个Adapter类,将一个类的接口转换成客户需要的另外一个接口,使得原来由于接口不兼容而导致不能一起工作的类可以协同工作(即Target和Adaptee)
Target* client2 = new Adapter;
client2->make();
}
引进的Adaptee类:
class Adaptee
{
public:
virtual ~Adaptee(){}
virtual void makePS2()
{
printf("制造PS2口\n");
}
};
显然,这时候要么就是直接修改Target类,但是这方法绝对不会是我们想要的,没有哪个商家会为了某个客人的喜好而冒然改变该类商品。但又必须满足每个客户的要求,这时我们就要作出变动,为那个客户设计一个适配器类来满足其需求,实在是有点无奈啊!不过没办法,谁叫顾客是上帝呢!
所以有了下面的Adapter类:
//#define OBJECT_ADAPTER
//对象适配器模式
#ifdef OBJECT_ADAPTER
class Adapter:public Target
{
private:
Adaptee* ps2;
public:
Adapter(){
ps2 = new Adaptee;
}
~Adapter(){
if( NULL != ps2 )
{
delete ps2;
}
}
void make(){
printf("Use object-adapter pattern!\n");
ps2->makePS2();
}
};
#else
//类适配器模式
class Adapter:public Target,private Adaptee
{
public:
void make()
{
printf("Use class-adapter pattern!\n");
this->makePS2();
}
};
有了这个适配器Adapter类,我们就能满足那个需要PS2口的客户的需求了,同时又不会影响到其他客户对Target类的需求,so nice!
个人感觉:设计模式只是一个参考,并不是要求必须用这个模式,只不过在这种情况下(这里只有某个客户需求,并不是绝大多数,所以短期内我们不想改变原有的Target类,又无法不使用第三方库的东西,这样就存在两个接口不兼容,而客户又希望还是通过原来的Target类接口来实现制造口,并不希望你提供另外一个新类)使用适配器模式或许会好点(如果贸然改变Target类,添加一个makePS2()接口,或许很多客户会咒骂我根本不要这东西,硬是塞给我浪费我空间哦!总之贸然改变提供给客户的类的接口,容易出现各种问题,不到逼不得已还是别了!)
追求的就是简单粗暴的分析。。。。。。