您的位置:首页 > 其它

设计模式(七)---适配器模式

2013-05-29 17:15 155 查看
网摘:

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那个类可以一起工作。

适用性

1.你想使用一个已经存在的类,而它的接口不符合你的需求。


2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。


3.你想使用一些已经存在的子类,但是不可能对每一个都进行

子类化以匹配它们的接口。对象适配器可以适配它的父类接口。


个人理解:

适配器,见文思义。我们在生活中也用过适配器,比如笔记本的电源线就是适配器。

一般家用的电压都是220v的,笔记本的电压绝对不可能到220,一般都是几十伏。但是我们在用电源的时候,

连接的就是220v的电压,之所以能正常工作就是有一个适配器把电压调到了合适的度。

在编程时,你可能遇到过这种情况,我的一个对象类需要继承一个接口,但是目前这个对象类已经存在了和这个接口

描述功能一样的方法。我要么修改这个对象类,去实现目标接口,要么把目标接口中的方法改成和现在的对象类一致。

实际上两种方案都不太现实。如果使对象类实现目标接口,那我需要修改整个类,如果这个类是接口或者抽象类,那就影响到所有

的子类,这个影响太巨大了。即使是一个简单的类,在某些情况下,你也不一定可以修改代码。假如我,修改目标接口,把目标接口

改成现在对象类已有的方法,使他们一致。这样更不可取。应为接口是描述对象行为的,之所以有接口就是为了以后有一个标准。

一旦标准建立,就不可能随便改,因为它涉及的范围更广,影响更大。

好比我们使用的笔记本电脑是20v,国家供电220v。不可能让国家为了你的笔记本能正常用电就专门提供一个20v的电压。

同样,笔记本的电压也不可能因为国家供电是220v,就设计成220v。唯一的办法就是做一个适配器。

下面是结构图



1,目标接口Electricity

packageorg.test.design.adapter;

publicinterfaceElectricity{

voidpowerOn220v();//国家供电单相220v
voidpowerOn380v();//国家供电三相380v
}


2,对象IProduct

packageorg.test.design.adapter;

publicinterfaceIProduct{
publicvoidinitPowerOn();
}


3,具体对象(实现IProduct接口)

packageorg.test.design.adapter;

publicclassComputerimplementsIProduct{

//接通电源20v
publicvoidinitPowerOn(){
System.out.println("IamComputer.MypowerisonandmyVoltageis20v.");
}

}


packageorg.test.design.adapter;

publicclassCellphoneimplementsIProduct{
//接通电源4.2v
publicvoidinitPowerOn(){
System.out.println("IamCellphone.MypowerisonandmyVoltageis4.2v.");
}
}


4,适配器Adapter

packageorg.test.design.adapter;

/**
*
*@authorlushuaiyin
*
*/
publicclassAdapterimplementsElectricity{
privateIProductproduct;

publicAdapter(IProductproduct){
this.product=product;
}
publicvoidpowerOn220v(){//只对220用电适配
product.initPowerOn();
}

publicvoidpowerOn380v(){//不属于家用电器的电压,不做适配
System.out.println("Adapterisnotsuitablefor380v.");
}

publicvoidsayHello(){
System.out.println("Iamanadapterfor220v.");
}
}


5,客户端测试

packageorg.test.design.adapter;

publicclassTestMain{

/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
IProductcomputer=newComputer();
ElectricitypowerForComputer=newAdapter(computer);
powerForComputer.powerOn220v();

IProductphone=newCellphone();
ElectricitypowerCellphone=newAdapter(phone);
powerCellphone.powerOn220v();

}

}
/*打印
IamComputer.MypowerisonandmyVoltageis20v.
IamCellphone.MypowerisonandmyVoltageis4.2v.

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: