首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

适配器与外观(Facade)方式(Head First版)

2012-07-25 
适配器与外观(Facade)模式(Head First版)适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让

适配器与外观(Facade)模式(Head First版)

适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

?

例如在香港的水货手机充电器插头无法适应大陆的插座,需要一个第三方转换器。这个转换器也就是适配器。

在介绍策略模式时,有写过一个鸭子接口

?

package com.headfirst.chapter7;public interface Duck {public void quack();public void fly();}

?绿头鸭是鸭子接口的子类

package com.headfirst.chapter7;public class MallardDuck implements Duck {public void fly() {System.out.println("I'm flying");}public void quack() {System.out.println("Quack");}}

现在再写一个火鸡接口,如下:

package com.headfirst.chapter7;/** * 火鸡接口 */public interface Turkey {public void gollbe();//火鸡不会呱呱叫,只会咯咯叫public void fly();//火鸡会飞,但是飞不远}

野生火鸡是火鸡的子类,如下:

package com.headfirst.chapter7;public class WildTurkey implements Turkey{public void fly() {System.out.println("I am flying a short distance");}public void gollbe() {System.out.println("Gollbe Gollbe!");}}

假设现在“市场”上缺鸭子对象,需要用一些野生火鸡?来冒充,但这野生火鸡的接口与鸭子的接口并不同,不能公然拿来用,

那么就写个适配器,将野生火鸡转换成鸭子。

package com.headfirst.chapter7;public class TurkeyAdapter implements Duck {Turkey turkey;//有一个火鸡的引用public TurkeyAdapter(Turkey turkey) {this.turkey = turkey;}public void fly() {for (int i = 0; i < 5; i++) {turkey.fly();//火鸡的飞行距离不如鸭子远,所以要飞5次}}public void quack() {turkey.gollbe();}}

?写个类来测试一下:

package com.headfirst.chapter7;public class DuckTestDriver {public static void main(String[] args) {Duck duck = new MallardDuck();//绿头鸭Turkey turkey = new WildTurkey();//野生火鸡testDuck(duck);duck = new TurkeyAdapter(turkey);//将野生火鸡转换成绿头鸭testDuck(duck);}private static void testDuck(Duck duck) {duck.quack();duck.fly();}}

?最后打印出:

QuackI'm flyingGollbe Gollbe!I am flying a short distanceI am flying a short distanceI am flying a short distanceI am flying a short distanceI am flying a short distance

完成!

看看适配器模式的UML类图:

适配器与外观(Facade)方式(Head First版)

对应我们上面的例子

适配器与外观(Facade)方式(Head First版)

关于装饰者模式与适配器模式的区别:

适配器模式强调转换,将一个接口转换成另一个符合客户期望的接口。

而装饰者模式强调添加新功能,用新的功能来包装原有的对象。

?

再来看另一个模式:外观模式(facade-pattern),之所以这么称呼,是因为它将一个或

? ? ? ? ? ? ? ? ? ? ? ? ? 数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。

看下面这个例子

假设有一个家族影院系统:

内含DVD播放器,功放,投影仪,自动屏幕,环绕立体声,甚至还有爆米花。

如果要使用这套家庭影院观看一部电影,那么可能要经过以下数个步骤:

1,打开爆米花

2,开始爆米花

3,打开功放

4,放下屏幕

5,调暗灯光

6,打开投影仪

.

.

.

以下还个数个步骤

电影观看完后,还要依次按上面的步骤关闭。

?

现在为家庭影院创建一个外观类HomeTheaterFacade,它对外暴露出几个简单的方法,如watchMovie,endMovie。

现在用户可以调用外观类的方法,而不用再调用各个子系统的方法,所以想再利用家庭影院看电影,只需要调用一个watchMovie方法就够了,

爆米花,功放,屏幕,DVD播放器等等一口气全部搞定。

外观只是提供你更直接的操作,并将原来的子系统隔离起来。

?

家庭影院外观类:

?

public class HomeTheaterFacade{  Amplifier amp;//功放  DVDplayer player;//DVD播放器  CdPlayer cdPlayer;//cd播放器  Project project;//投影仪  ...  public HomeTheaterFacade(Amplifier amp,DVDplayer player,....){      this.amp = amp;      this.player = player;      .....  }  public void watchMovie(String movie){      System.out.println("get ready to watch movie");      amp.on();      player.on();      ......  }  public void endMovie(){      System.out.println("Shutting movie now");      amp.off();      player.off();      ....  }}

?

?客户类可以直接使用这个facade类所提供的watchMovie类来观看电影,而无需再调用各个子系统的功能了。

外观模式的定义:

提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。

适配器与外观(Facade)方式(Head First版)

外观模式与适配器模式的区别:

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

?

要点:当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器,

当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观,

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

热点排行