适配器和外观模式

来源:互联网 发布:用网络发短信的软件 编辑:程序博客网 时间:2024/04/30 04:44
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间
适配器模式在我们显示生活中很常见。比如你在Hong Kong买了个Iphone6手机,你会发现它的标配送的充电器居然是三孔大的充电接口,但是内地没有这种借口的啊。
这时候你就需要适配器将这种借口进行转换,转换为能接受的接口

适配器可以将一个接口转换成另一个接口,以符合客户的期望

适配器实现了目标接口,并持有被适配者的实例。
下面介绍一个实例。原本插口为3口插座,但是新的插口都是2口插座。我们需要将3口插座转换为2口插座。
首先声明两个统一的插座接口,一个OldThreePort一个NewTwoPort,所有电器都实现这两个接口
interface TwoPort{public void workByTwoPort();}class IphoneNewPort implements TwoPort{//新的iphone接口为2口@Overridepublic void workByTwoPort() {// TODO Auto-generated method stubSystem.out.println("双口插座");}}interface ThreePort{void workByThreePort();}class IphoneOldPort implements ThreePort{//老的iphone为3口@Overridepublic void workByThreePort() {// TODO Auto-generated method stubSystem.out.println("三口插座");}}
下面就是我们的适配器类了。该适配器类实现了2口插座(目标接口)的接口,并且拥有3口插座(被适配者)的实例。

public class InterfaceAdapter implements TwoPort{    ThreePort threePort;public InterfaceAdapter(ThreePort tp) {// TODO Auto-generated constructor stub    this.threePort=tp;}@Overridepublic void workByTwoPort() {// TODO Auto-generated method stubthreePort.workByThreePort();}}

客户通过目标接口调用适配器的方法对适配器发出请求。

适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口

客户接受到调用的结果,但并未察觉这一切是适配器在起转换作用。

public static void main(String args[]){ThreePort threePort=new IphoneOldPort();TwoPort adapter=new InterfaceAdapter(threePort);adapter.workByTwoPort();//客户以为在使用2口插座,并未察觉适配器,也未察觉3口插口}
适配器将一个接口转换成另一个。

但是我们都知道这个世界其实复杂很多。需要让一个适配器包装多个被适配者。这就涉及另一个模式——外观模式

外观模式将一个或多个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。

如我们生活中比如要看电影。但是必须执行一些任务。这些人物包括:将灯光调暗、打开电视、打开dvd,放映电影操作。

这如果编码实现,会涉及很多的类和方法的调用。

外观模式通过实现一个提供更合理的接口的外观类,可以将一个复杂的子系统变的容易。

下面将一个简单的例子来进行代码的编写。

class TV{public void startup(){System.out.println("打开电视");}}class DVD{public void startup(){System.out.println("打开DVD");}}class Movie{public void startup(){System.out.println("放映电影");}}class Light{public void startup(){System.out.println("灯光变暗");}}
外观类实现,提供统一的接口

public class MovieFacade {    TV tv;    DVD dvd;    Movie movie;    Light light;    public MovieFacade( TV tv,DVD dvd,Movie movie,Light light){    this.dvd=dvd;    this.tv=tv;    this.movie=movie;    this.light=light;    }    public void watchMovie(){    light.startup();    tv.startup();    dvd.startup();    movie.startup();    }}
外观类不只是简化了接口,它也将客户从组件的子系统中解耦出来。降低了客户与系统的耦合性。

外观和适配器都可以包装很多类。但是外观的意图是简化接口,而适配器的意图是将接口转换成同的接口

外观模式符合“最少知识”原则,即只和你密友谈话。

当你设计一个系统,不管是任何对象,你都要注意它所交互的类有哪些,并注意它和这些类时如何交互的。这个设计原则让我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响其他部分。

如下,这种方法耦合了很多类。如果其中一个更改,那么我们将对这个方法进行重新的修改。

public float getTemp(){    return station.getThermometer().getTemperature(); }
这样的解决方法是我们在station所属类中加入getTemperature()方法。这就要求我们如果某对象是调用其他的方法的返回结果,不要调用该对象的方法。这样子可以降低耦合性。
适配器和外观以其装饰者模式,这三个模式有点相似,但是其功能不一样

适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;外观是将一群对象“包装”起来,以简化其接口。



1 0
原创粉丝点击