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

合集下载

适配器(Adaptor)模式PPT教学课件

适配器(Adaptor)模式PPT教学课件
public double getMass(){ } public double getThrust(){ } public void setSimTime(double time){this.time=time;} }
2020/12/10
7
类适配器简单例子
public interface Print { public abstract void printWeak(); public abstract void printStrong();
} }
2020/12/10
9
对象适配器
Client
RequiredClass ______________ requiredMethod()
ExistingClass __________ usefulMethod()
} ============================ public class Main {
public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong();
2020/12/10
4
Adapter模式
Struct
class adapter
object adapter
2020/12/10
5
例子
《interface》
RocketSim getMass():double getThrust():double setSimTime(t:double)
PhysicalRocket
} -------------------------public class Banner {

深入设计模式(三)——适配器模式

深入设计模式(三)——适配器模式

深⼊设计模式(三)——适配器模式⼀、适配器设计模式介绍适配器模式,将⼀个类装换成客户期望的另外⼀个接⼝。

Adapter模式使⽤的原本由于接⼝不兼容⽽不能茉莉花物那些可以⼀起⼯作。

⼆、解决的问题1、使⽤第三⽅组件,⽽这个组件的接⼝与⽬前系统接⼝不兼容(如⽅法与系统⽅法不⼀致等),可以使⽤适配器模式解决接⼝不兼容问题。

2、使⽤早前项⽬⼀些有⽤的类,可以⽤适配器模式解决现有接⼝与原有对象接⼝不兼容问题。

三、⽣活中的例⼦适配器模式允许将⼀个类的接⼝转换成客户期望的另⼀个接⼝,使⽤原本由于接⼝不兼容⽽不能⼀起⼯作的类可以⼀起⼯作。

扳⼿提供了⼀个适配器的例⼦。

⼀个孔套在棘齿上,棘齿的每个边的尺⼨是相同的。

在美国典型的连长为1/2和1/4。

显然,如果不使⽤⼀个适配器的话,1/2的棘齿不能适合1/4的孔。

⼀个1/2到1/4的适配器具有⼀个1/2的阴槽来套上⼀个1/2的齿,同时有⼀个1/4的阳槽来卡⼊1/4的扳⼿。

四、适配器分析1.适配器模式结构2.代码1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9///<summary>10///客户期待的接⼝或者抽象类Target11///</summary>12public abstract class Target13 {14public abstract void Request();15 }16 }客户期待的接⼝或者抽象类Target1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9///<summary>10///要适配的类Adaptee,也就是与期望调⽤接⼝不相符的类11///</summary>12public class Adaptee13 {14public void SpecificReques() {15 Console.WriteLine("执⾏要适配类的特殊请求⽅法");16 }17 }18 }要适配的类Adaptee,也就是与期望调⽤接⼝不相符的类1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9public class Adapter:Target10 {11private Adaptee adaptee;12public override void Request()13 {14if (adaptee == null) {15 adaptee = new Adaptee();16 }17 adaptee.SpecificReques();18 }19 }20 }适配器类Adapter,把源接⼝转换成⽬标接⼝,包⾏变量adaptee1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9///<summary>10///适配器模式,将⼀个类装换成客户期望的另外⼀个接⼝。

适配器模式

适配器模式

• 想想可以解决的方法: • 写一系列的if语句来一条条的判断.但这样的写法 虽然可以实现目前的需求,可如果当税率发生了变 化你又得拿出你的程序一步一步的修改.如果if语 句的条数发生变化的话我们还必须在代码中添加 必要的if判断.这对于程序的维护来说是相当麻烦 的.如果我们使用职责链模式的话就可以相当简单 了. • 先说说我们的设计思想. • 我们可以采用职责链完成所得税的计算,由职责链 上的一个对象负责计算某一段的所得税.如果符合 计算条件,则计算;否则由下一个对象计算.
• 责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每 一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传 递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端 并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不 影响客户端的情况下动态地重新组织链和分配责任。
• • •
责任链模式和状态模式的异同
• 职责链模式:当客户提交一个请求时,请求是沿链传递直至有一个 ConcreteHander对象负责处理它。接收者和发送者都没有对方的明 确信息,且链中的对象自己并不知道链的结构,在运行时自动确定。 结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继 者的引用或指针,而不需要保持它所有的候选接受者。这也就大大降 低了耦合度了。也就是说,我们可以随时地增加或修改处理一个请求 的结构。增强了给对象指派职责的灵活性。 • 状态模式:状态模式主要解决的是当控制一个对象状态转换的条件表 达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系 列类当中,可以把复杂的判断逻辑简化。状态模式将与特定状态相关 的行为局部化,并且将不同状态的行为分割开来。即将特定的状态相 关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某 个ConcreteState中,所以通过定义新的子类可以很容易地增加新的 状态和转换。这样做的目的是为了消除庞大的条件分支语句。状态模 式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间 的依赖。

10.设计模式.适配器模式(Adapter)

10.设计模式.适配器模式(Adapter)

武汉科技大学

适配器模式(Adapter)
static void Main(string[] args) { Player pp = new Forwards("Patrick Patterson"); pp.Attack(); Player tw = new Guards("Terrence Williams"); tw.Attack(); ForeignCenter ym = new ForeignCenter("姚明"); ym.进攻(); } Console.Read();
球员
+Attack() +Defense()
前锋 +Attack() +Defense()
中锋 +Attack() +Defense()
后卫 +Attack() +Defense()
外籍中锋 +进攻() +防守()
武汉科技大学

问题(Problem) 火箭教练的指挥
Patrick Patterson, Attack(前锋 帕特里克-帕特森) Terrence Williams, Attack(后卫 泰伦斯-威廉姆斯) Yao Ming,Attack (中锋 姚明)
武汉科技大学

适配器模式(Adapter) 类适配器和对象适配器
假设我们在软件开发中要记录日志,包括数据ቤተ መጻሕፍቲ ባይዱ记录日志 DatabaseLog和文本文件记录日志WriteLog
武汉科技大学

适配器模式(Adapter) 类适配器和对象适配器
武汉科技大学

适配器模式(Adapter)

C++之适配器设计模式和外观模式

C++之适配器设计模式和外观模式

所谓建造者设计模式是指将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式的优点:1、建造者独立,易于扩展。

2、便于控制细节风险。

建造者模式缺点:1、产品必须有共同点,范围有限制。

2、如果内部变化复杂,将会有很多建造类。

适用场景:1、需要生成的对象具有复杂的结构。

2、需要生成的对象内部属性本身相互依赖。

代码实现:比如联想有众多型号的电脑,比如ThinkPad 和 Yoga,它们结构基本一致,都是由CPU,主板、内存、显卡等组成。

如果为每台电脑单独设计一套组装流程,管理成本太高,用建造者设计模式可以为它们设计一个统一的组装流程。

创建产品我们需要一个 Computer 类,它可以通过组装零件来创建。

// product.h#ifndef PRODUCT_H#define PRODUCT_H#include <iostream>using namespace std;// 电脑class Computer{public:void SetmCpu(string cpu) { m_strCpu = cpu;}void SetmMainboard(string mainboard) { m_strMainboard = mainboard; }void SetmRam(string ram) { m_strRam = ram; }void SetVideoCard(string videoCard) { m_strVideoCard = videoCard; } string GetCPU() { return m_strCpu; }string GetMainboard() { return m_strMainboard; }string GetRam() { return m_strRam; }string GetVideoCard() { return m_strVideoCard; }private:string m_strCpu; // CPUstring m_strMainboard; // 主板string m_strRam; // 内存string m_strVideoCard; // 显卡};#endif // PRODUCT_H创建抽象建造者产品类准备好以后,就可以创建 Builder 了,Builder 提供的功能用于创建电脑的各个部件。

适配器模式培训教学课件下载(PPT38张)

适配器模式培训教学课件下载(PPT38张)

Adaptee
+ specificRequest () ...
Adapter
adaptee
+ request () ...
adaptee.specificRequest();
适配器模式
模式结构
✓ 适配器模式包含如下角色: • Target:目标抽象类 • Adapter:适配器类 • Adaptee:适配者类 • Client:客户类
• 参考代码 (Chapter 10 Adapter\sample01)
演示……
适配器模式
适配器模式实例与解析
✓ 实例二:加密适配器 • 某系统需要提供一个加密模块,将用户信息(如密码 等机密信息)加密之后再存储在数据库中,系统已经 定义好了数据库操作类。为了提高开发效率,现需要 重用已有的加密算法,这些算法封装在一些由第三方 提供的类中,有些甚至没有源代码。使用适配器模式 设计该加密模块,实现在不修改现有类的基础上重用 第三方加密方法。
功能更为强大的结构。 装饰模式(Decorator)
桥接模式(Bridge)
适包配装器 器模(W式rap(Ap✓dear)p。Ater dPataterpn) :t将e一r个P接a口转tt换e成r客n户希: 望C的o另一n个v接e口r,t适t配h器模e式i使n接t口e不r兼f容a的c那e些类o可f以a一起c工l作a,s其s别名为
演示……
适配器模式
模式优缺点
✓ 适配器模式的优点
• 将目标类和适配者类解耦,通过引入一个适配器类来重用现有 的适配者类,而无须修改原有代码。
• 增加了类的透明性和复用性,将具体的实现封装在适配者类中, 对于客户端类来说是透明的,而且提高了适配者的复用性。

外观模式ppt较完整版

外观模式ppt较完整版

外观模式
• 模式优缺点
– 外观模式的优点
• 对客户屏蔽子系统组件,减少了客户处理的对象数目 并使得子系统使用起来更加容易。同时,客户代码变 简单 • 实现了子系统与客户之间的松耦合关系。
外观模式
• 模式优缺点
– 外观模式的优点
• 降低了大型软件系统中的编译依赖性,并简化了系 统在不同平台之间的移植过程。 • 只是提供了一个访问子系统的统一入口,并不影响 用户直接使用子系统类。
外观模式
• 模式扩展注意
– 不要试图通过外观类为子系统增加新行为
• 不要通过继承一个外观类在子系统中加入新的行为, 这种做法是错误的。 • 外观模式的用意:为子系统提供一个集中化和简化的 沟通渠道
外观模式
• 模式扩展
– 外观模式与迪米特法则
• 外观模式创造出一个外观对象,将客户端所涉及的属 于一个子系统的协作伙伴的数量减到最少,使得客户 端与子系统内部的对象的相互作用被外观对象所取代。 • 外观模式就是实现代码重构以便达到“迪米特法则” 要求的一个强有力的武器。
• 当要为一个复杂子系统提供一个简单接口时可以使用 外观模式。 • 客户程序与多个子系统之间存在很大的依赖性。 • 在层次化结构中,可以使用外观模式定义系统中每一 层的入口,层与层之间不直接产生联系,而通过外观 类建立联系,降低层之间的耦合度。
外观模式
• 模式扩展
– 一个系统有多个外观类 • 在外观模式中,通常只需要一个外观类,并且此外观类只有一 个实例,换言之它是一个单例类。在很多情况下为了节约系统 资源,一般将外观类设计为单例类。当然这并不意味着在整个 系统里只能有一个外观类,在一个系统中可以设计多个外观类, 每个外观类都负责和一些特定的子系统交互,向用户提供相应 的业务功能。

第12适配器模式和外观模式PPT优秀课件

第12适配器模式和外观模式PPT优秀课件

8
客户使用适配器过程
① 客户通过目标接口调用适配器的方法对适配器发出请求。
② 适配器使用被适配者接口把请求转换成被适配者的一
个或多个调用接口。
③ 客户收到调用结果,但并未察觉这一切是适配器在起
转换作用。
客户和被适配者是解 耦的。
9
适配器模式定义
适配器模式将一个类的接口转换成客户
期望的另一个接口。适配器让原本不兼容的 类可以合作无间。
}
}
}
5
测试适配器
public class DuckTestDrive { public static void main(String[] args) {
火鸡包装进火鸡 适配器中,使它 看起来象一只鸭
MallardDuck duck = new MallardDuck();
子。
WildTurkey turkey = new WildTurkey();
}
火鸡不会呱呱叫, 只会咯咯叫。火 鸡也会飞,虽然
飞不远。
public class WildTurkey implements Turkey { public void gobble() { System.out.println("Gobble gobble");
火鸡的一 个具体实
现。
}
public void fly() {
Tuner
am plifier
on() off() setA m() s et F m () setFrequency () t o St r in g( )
Screen
up () dow n() t o St r in g( )
爆米花机 P o pc o r m P o ppe r on() off() p op () t o St r in g( )
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TheaterLi ghts
on() off() dim() toString()
DvdPl ayer
amplifier
on() off() ejet() p ause() p lay () setSurroundAudio() setTwoChannelAudio() st op ()
有很多类, 很多交互,
DvdPlayer amp lifier on() off() ejet() p ause() p lay () ...
Projector dvdPlay er on() off() tvM ode() wideScreen() toString()
喜欢自己操 作这些组件!
15
简化外观(续)
子系统外观 的客户端。
Client
Target request()
Adaptee specificRequest()
对象适配器可适配某个 类及其子类。但是,需 要实现被适配者,多一 个对象,效率低点。
Adapter request()
类适配器不是 使用组合来适 配被适配者, 而是继承被适 配者和目标类。
11
家庭影院
调谐器
}
火鸡不会呱呱叫, 只会咯咯叫。火 鸡也会飞,虽然
飞不远。
public class WildTurkey implements Turkey { public void gobble() { System.out.println("Gobble gobble");
火鸡的一 个具体实
现。
}
public void fly() {
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()
还有一大群
接口。
Projector
dvdPlayer
on() off() tvM ode() wideScreenM ode() toString()
12
观赏电影
⑴ 打开爆米花机 ⑵ 开始爆米花 ⑶ 灯光调暗
看完还得一 个个关掉!
⑷ 放下屏幕
⑸ 打开投影机
⑹ 将投影机的输入切换到DVD
⑺ 将投影机切换到宽屏方式
this.amp = amp; this.tuner = tuner; this.dvd = dvd; this.cd = cd; this.projector = projector; this.screen = screen; this.lights = lights; this.popper = popper; } // 其它方法 }
HomeTheaterFacade
watchMovie()
endMovie()
listenToCd()
endCd()
listenToRadio()
endRadio()
外观要 简化的 子系统。
Tuner amp lifier on() off() setAm() setFm() ...
S creen up () down() toString()
PopcormPopper on() off() toString()
Amplifier tuner dvdPlay er cdPlay er on() off() setCd() setDvd() ...
CdPlayer amp lifier
on() off() ejet() ...
TheaterLights on() off() ...
外观子系统中每一个 组件的引用都传入它 的构造器中。然后, 外观把它们赋值给相
应的实例变量。
18
实现简化的接口
public void watchMovie(String movie) { System.out.println("Get ready to watch a movie..."); popper.on();
客户代码可以调用家庭影院 外观所提供的方法,不必调 用这个子系统的方法。要想 看电影,只要调用一个方法 (watchMovie())就可以了。
外观只是提供更直接 的操作,并未将原来 的子系统阻隔起来。 如果需要子系统类的 更高层功能,还可以 使用原来的子系统。
16
构造家庭影院的外观
public class HomeTheaterFacade {
public HomeTheaterFacade(Amplifier amp, // 构造方法 Tuner tuner, DvdPlayer dvd, CdPlayer cd, Projector projector, Screen screen, TheaterLights lights, PopcornPopper popper) {
screen.down(); // 放下屏幕
projector.on();
projector.setInput(dvd);
打开投影机,设置为DVD和宽屏模式…
projector.wideScreenMode();
amp.on();
amp.setDvd(dvd);
打开功放,设置为DVD,调整成
amp.setSurroundSound(); 环绕立体声模式,音量调到5…
Tuner
amplifier
on() off() setAm() setFm() set Frequency () toString()
Screen
up () down() toString()
爆米花机 PopcormPopper on() off() p op () toString()
放大器
Ampl i fi er
测试鸭子。
System.out.println("\nThe TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
测试适配器:传
duck.quack(); duck.fly();
入一个假装鸭子 的火鸡。
⑻ 打开功放
⑼ 将功放输入设置为DVD
⑽ 将功放设置为环绕立体声
⑾ 将功放音量调到中(5)
⑿ 打开DVD播放器
⒀ 开始播放DVD
开这么多东西, 太累啦!
13
开机任务写成类和方法调用
popper.on(); 打开爆米花机,开始爆米花 popper.pop();
lights.dim(10); // 灯光调暗
第十二章 适配器模式和外观模式
适配器
欧洲壁式插座
交流适配器 美国标准交流电插头
适转配换器成将另一一种种接接口口。
1
面向对象适配器
现系 有统 的
厂 商 类
两个接口无法匹配, 所以无法工作。
现系 有统 的
适厂 配商 器类
不需改变代码 新代码 不需改变代码
现系 有统 的






这个适配器实现了 所期望类的接口。
而且这个适配器也能 和厂商类的接口沟通。
2
适配鸭子的火鸡
public interface Duck { public void quack(); public void fly();
鸭子接口,具 备呱呱叫和飞
行能力。
}
public class MallardDuck implements Duck {
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says...");
turkey.gobble(); turkey.fly();
测试火鸡。
System.out.println("\nThe Duck says..."); testDuck(duck);
System.out.println("I'm flying a short distance");
}
}
4
火鸡适配器
假定缺鸭子对象,用火鸡对象来冒充,需要为火鸡对
象写一个适配器。
public class TurkeyAdapter implements Duck {
Turkey turkey; public TurkeyAdapter(TurktVolume(5);
dvd.on(); dvd.play(movie);
打开DVD播放机。
14
创建一个HomeTheaterFacade
watchMovie()
的新类,它对外有几个简单 的方法。
这个外观将家庭影院的诸 多组件视为一个子系统,
外观
通过调用这个子系统,来
简化外观
实现watchMovie()方法。
Client
客户只看到 目标接口。
<<interface>>
Target request()
适配器实现 目标接口。
Adapter request()
被适适配配器者组。合
Adaptee specificRequest()
所有的请求都委 托给被适配者。
类图
10
对象和类适配器
有两种适配器:对象适配器和类适配器。前一页是对 象适配器类图,类适配器类图如下:
相关文档
最新文档