第十二章 适配器模式和外观模式 PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

测试鸭子。
System.out.println("\nThe TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
测试适配器:传
duck.quack(); duck.fly();
入一个假装鸭子 的火鸡。
this.turkey = turkey;
构造器获得 适配对象的
引用。
}
public void quack() {
turkey.gobble();
} public void fly() {
for(int i=0; i < 5; i++) {
火鸡飞行距离短, 连续5次调用火鸡
的fly()方法。
turkey.fly();
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I'm flying");
}
}
绿头鸭是 鸭子的子
类。
3
适配鸭子的火鸡(续)
public interface Turkey { public void gobble(); public void fly();
外观子系统中每一个 组件的引用都传入它 的构造器中。然后, 外观把它们赋值给相
应的实例变量。
18
实现简化的接口
public void watchMovie(String movie) { System.out.println("Get ready to watch a movie..."); popper.on();
}
}
6
测试结果
火鸡咯咯叫,且 飞行距离短。
鸭子呱呱叫, 并能飞行。
Quack()被调用时,适配 器咯咯叫;fly()被调用 时,适配器飞行了5次。 testDuck()方法根本不知 道,这其实是一只假装
成鸭子的火鸡。
7
适配器模式分析
客户
被适配者
客户是依据目标 接口实现的。
适配器
目标接口适并配持器有实被现适了配目者火并标的鸡引接实适用口例配了,。者一实个现被了适目配标者接。被 者口适 接,配 口火适鸡配就者是接被口。
Client
Target request()
Adaptee specificRequest()
对象适配器可适配某个 类及其子类。但是,需 要实现被适配者,多一 个对象,效率低点。
Adapter request()
类适配器不是 使用组合来适 配被适配者, 而是继承被适 配者和目标类。
11
家庭影院
调谐器
而且这个适配器也能 和厂商类的接口沟通。
2
适配鸭子的火鸡
public interface Duck { public void quack(); public void fly();
鸭子接口,具 备呱呱叫和飞
行能力。
}
public class MallardDuck implements Duck {
this.amp = amp; this.tuner = tuner; this.dvd = dvd; this.cd = cd; this.projector = projector; this.screen = screen; this.lights = lights; this.popper = popper; } // 其它方法 }
public HomeTheaterFacade(Amplifier amp, // 构造方法 Tuner tuner, DvdPlayer dvd, CdPlayer cd, Projector projector, Screen screen, TheaterLights lights, PopcornPopper popper) {
HomeTheaterFacade
watchMovie()
endMovie()
listenToCd()
endCd()
listenToRadio()
endRadio()
外观要 简化的 子系统。
Tuner amp lifier on() off() setAm() setFm() ...
S creen up () down() toString()
Tuner
amplifier
on() off() setAm() setFm() set Frequency () toString()
Screen
up () down() toString()
爆米花机 PopcormPopper on() off() p op () toString()
放大器
Ampl i fi er
⑻ 打开功放
⑼ 将功放输入设置为DVD
⑽ 将功放设置为环绕立体声
⑾ 将功放音量调到中(5)
⑿ 打开DVD播放器
⒀ 开始播放DVD
开这么多东西, 太累啦!
13
开机任务写成类和方法调用
popper.on(); 打开爆米花机,开始爆米花 popper.pop();
lights.dim(10); // 灯光调暗
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says...");
turkey.gobble(); turkey.fly();
测试火鸡。
System.out.println("\nThe Duck says..."); testDuck(duck);
客户代码可以调用家庭影院 外观所提供的方法,不必调 用这个子系统的方法。要想 看电影,只要调用一个方法 (watchMovie())就可以了。
外观只是提供更直接 的操作,并未将原来 的子系统阻隔起来。 如果需要子系统类的 更高层功能,还可以 使用原来的子系统。
16
构造家庭影院的外观
public class HomeTheaterFacade {
DvdPlayer amp lifier on() off() ejet() p ause() p lay () ...
Projector dvdPlay er on() off() tvM ode() wideScreen() toString()
喜欢自己操 作这些组件!
15
简化外观(续)
子系统外观 的客户端。
还有一大群
接口。
Projector
dvdPlayer
on() off() tvM ode() wideScreenM ode() toString()
12
观赏电影
⑴ 打开爆米花机 ⑵ 开始爆米花 ⑶ 灯光调暗
看完还得一 个个关掉!
⑷ 放下屏幕
⑸ 打开投影机
⑹ 将投影机的输入切换到DVD
⑺ 将Hale Waihona Puke Baidu影机切换到宽屏方式
popper.pop(); lights.dim(10); screen.down(); projector.on(); projector.wideScreenMode(); amp.on(); amp.setDvd(dvd); amp.setSurroundSound(); amp.setVolume(5);
PopcormPopper on() off() toString()
Amplifier tuner dvdPlay er cdPlay er on() off() setCd() setDvd() ...
CdPlayer amp lifier
on() off() ejet() ...
TheaterLights on() off() ...
8
客户使用适配器过程
① 客户通过目标接口调用适配器的方法对适配器发出请求。
② 适配器使用被适配者接口把请求转换成被适配者的一
个或多个调用接口。
③ 客户收到调用结果,但并未察觉这一切是适配器在起
转换作用。
客户和被适配 者是解耦的。
9
适配器模式定义
适配器模式将一个类的接口转换成客户
期望的另一个接口。适配器让原本不兼容的 类可以合作无间。
screen.down(); // 放下屏幕
projector.on();
projector.setInput(dvd);
打开投影机,设置为DVD和宽屏模式…
projector.wideScreenMode();
amp.on();
amp.setDvd(dvd);
打开功放,设置为DVD,调整成
amp.setSurroundSound(); 环绕立体声模式,音量调到5…
}
}
}
5
测试适配器
public class DuckTestDrive { public static void main(String[] args) {
火鸡包装进火鸡 适配器中,使它 看起来象一只鸭
MallardDuck duck = new MallardDuck();
子。
WildTurkey turkey = new WildTurkey();
第十二章 适配器模式和外观模式
适配器
欧洲壁式插座
交流适配器 美国标准交流电插头
适转配换器成将另一一种种接接口口。
1
面向对象适配器
现系 有统 的
厂 商 类
两个接口无法匹配, 所以无法工作。
现系 有统 的
适厂 配商 器类
不需改变代码 新代码 不需改变代码
现系 有统 的






这个适配器实现了 所期望类的接口。
System.out.println("I'm flying a short distance");
}
}
4
火鸡适配器
假定缺鸭子对象,用火鸡对象来冒充,需要为火鸡对
象写一个适配器。
public class TurkeyAdapter implements Duck {
Turkey turkey; public TurkeyAdapter(Turkey turkey) {
}
火鸡不会呱呱叫, 只会咯咯叫。火 鸡也会飞,虽然
飞不远。
public class WildTurkey implements Turkey { public void gobble() { System.out.println("Gobble gobble");
火鸡的一 个具体实
现。
}
public void fly() {
Amplifier amp;
Tuner tuner;
DvdPlayer dvd; CdPlayer cd; Projector projector;
组合:子系 统组件都在
这里。
TheaterLights lights;
Screen screen;
PopcornPopper popper;
17
构造家庭影院的外观
amp.setVolume(5);
dvd.on(); dvd.play(movie);
打开DVD播放机。
14
创建一个HomeTheaterFacade
watchMovie()
的新类,它对外有几个简单 的方法。
这个外观将家庭影院的诸 多组件视为一个子系统,
外观
通过调用这个子系统,来
简化外观
实现watchMovie()方法。
Client
客户只看到 目标接口。
<<interface>>
Target request()
适配器实现 目标接口。
Adapter request()
被适适配配器者组。合
Adaptee specificRequest()
所有的请求都委 托给被适配者。
类图
10
对象和类适配器
有两种适配器:对象适配器和类适配器。前一页是对 象适配器类图,类适配器类图如下:
tuner dvdPlay er cdPlay er
on() off() setCd() setDvd() setStereoSound() setSurroundSound() ...
CdP l ayer
amplifier
on() off() ejet() p ause() p lay () st op () toString()
将以前手动任务 依次处理。每项 任务都是委托子 系统中相应的组
件处理。
dvd.on(); dvd.play(movie); }
19
实现简化的接口(续)
public void endMovie() {
System.out.println("Shutting movie theater down...");
TheaterLi ghts
on() off() dim() toString()
DvdPl ayer
amplifier
on() off() ejet() p ause() p lay () setSurroundAudio() setTwoChannelAudio() st op ()
有很多类, 很多交互,
相关文档
最新文档