大话设计模式
字体: 16 + -

第19章

时间:12月16日地点:大b房间人物:大b,校

都说学好普通话,走遍中国都不怕。就好像anne来到我们班,如果说她只会说英文,那我们好大一部分同学都不一定听得懂。可是她还会说中文,那以后和大家在一起沟通就好多了。就好比我们讲的适配器。

大b:“师弟,你知道什么是适配器模式吗?”

小a:“就是把一个类的接口转换成客户端所期待的另一种接口,从而使原接口不匹配而无法在一起工作的两个类能在一起工作。”

大b:“从功能上讲这些接口不兼容的类一般具有相同或相似的功能。通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原有的接口,或者我们压根就没有原有对象的源代码那该怎么办呢?此时adapter模式就会派上大用场了。你能不能用代码来实现呐?”

小a:“好。我试一下。”

如果有两个编译好的(无源代码)类,类a有某些功能,但是需要一个xml读取模块才能工作,这个模块要实现这个接口:

publicinterfacexmlreader{

publicinputstreamxmlreader();

}

你的另一个类b恰好有这个功能,但是b实现的是这个接口:

publicinterfacereaderxml{

publicinputstreamreaderxml();

}

这个时候我们的做法是写个适配器

publicclassadapterimplementsxmlreaderextendsb{

publicinputstreamxmlreader(){

returnreaderxml();

}

}

这个就是适配器模式了。

适配器模式还有另外一种实现方式

publicclassadapterimplementsxmlreader

readerxmlb=newb();

publicinputstreamxmlreader(){

returnb.readerxml();

}

}

大b:“对,没错!上次有个朋友从美国给我带回一个微波炉,但因为美国的生活用电电压是110v,而中国的电压是220v,所以我不能使用,幸好朋友有先见之明,给我带回一个变压器,能把220v电压转换成110v电压,我才可以放心使用了。”

小a:“嘿嘿!师兄你那位朋友还挺有心的嘛!一定是位很要好的朋友吧?”

大b:“还不就是那个大学时候的死党老e,那鸟人大学毕业后一直在国外,听说最近要回来一趟哩!”

小a:“是吗?那到时你们可爽了,又可以一起喝酒啦!”

大b:“嘿嘿!是啊!毕业几年一直没见过那鸟人,跑国外喝了几年洋墨水,回来一定得好好宰他一顿。”

小a:“那是要的啦!”

大b:“对了,你编程学得不错,能不能把刚才我说的,也就是微波炉电压转换用代码表示?”

小a:“好。通过适配,使c220类能在c110类中使用。”

程序代码:

include《iostream.h》

classc220v

{

public:

voiddianya220v()

{

cout《“220v电压!”《endl;

}

};

classc110v

{

public:

virtualvoiddianya110v()=0;

};

classadaper:publicc110v

{

private:

c220v*c220obj;

public:

adaper(c220v*obj)

{

c220obj=obj;

}

voiddianya110v()

{

c220obj->dianya220v();

cout《“经变压器转换成”《endl;

cout《“110v电压”《endl;

}

};

intmain()

{

c220v*c220vobj=newc220v;

adaperadobj(c220vobj);

adobj.dianya110v();

return1;

}

运行结果:

220v电压!

经变压器转换成

110v电压

大b:“吼!非常不错喔!”