第十二章 适配器模式和外观模式 PPT课件
- 格式:ppt
- 大小:6.84 MB
- 文档页数:28
深⼊设计模式(三)——适配器模式⼀、适配器设计模式介绍适配器模式,将⼀个类装换成客户期望的另外⼀个接⼝。
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///适配器模式,将⼀个类装换成客户期望的另外⼀个接⼝。
所谓建造者设计模式是指将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式的优点: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 提供的功能用于创建电脑的各个部件。
设计模式之适配器模式与外观模式(二)好了,通过上次的学习,我们已经知道适配器模式是如何将一个类的接口转换成另一个符合客户期望的接口。
同时也知道在Java中要做到这一点,必须将一个不兼容接口的对象包装起来,变成兼容的对象。
我们现在要看一个改变接口的新模式,但是它改变接口的原因是为了简化接口。
这个模式被巧妙地命名为外观模式(Facade-Pattern),之所以这么称呼,是因为它将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。
繁琐的看电影步骤还记得我们之前说过的命令模式中,一个遥控器能控制很多家电的过程吧。
简单的开关我们都会,复杂的模式,就比较麻烦,比如看电影的步骤:1.打开爆米花机2.开始爆米花3.将灯光调暗4.放下屏幕5.打开投影机6.将投影机的输入切换到DVD7.将投影机设置在宽屏模式8.打开功放9.将功放的输入设置为DVD10.将攻放设置为环绕立体声11.将攻放音量调到中12.打开DVD播放器13.开始播放DVD看一个电影,真的是如此繁琐。
而且看完电影之后,还得过去把这些步骤都关闭。
是用你的家庭影院竟然变得如此复杂!让我们看看外观模式如何解决这团混乱,好让你轻松享受。
灯光、相机、外观!你需要的正是一个外观:有了外观模式,通过实现一个提供更合理的接口的外观类,你可以将一个复杂的子系统变得容易使用。
1.我们为家庭影院系统创建一个外观,命名为HomeTheaterFacade,它对外暴露出几个简单的方法,例如watchMovie()2.这个外观类将家庭影院诸多组件视为一个子系统,通过调用这个子系统,来实现watchMovie()方法3.现在,你的客户代码可以调用此家庭影院外观所提供的方法,而不必再调用这个子系统的方法。
4.外观只是提供你更直接的操作,并未将原来的子系统阻隔起来。
如果你需要子系统类的更高层的功能呢,还是可以使用原来的子系统的构造家庭影院外观好了,那接下来就到实战阶段啦。
设计模式之适配器模式设计模式是软件开发中常用的解决方案,它提供了一种被广泛认可的、可重用的解决方案模板。
一种常用的设计模式是适配器模式,它用于将一个类的接口转换成客户端所期待的另一种接口。
本文将介绍适配器模式的概念、应用场景和实现方法。
一、概述适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行协同工作。
适配器通过包装已有的类,将现有的接口转换成客户端所期待的接口,使得原本由于接口不兼容而无法工作的类可以一起协同工作。
适配器模式通常用于以下几种情况:1. 需要使用一个已经存在的类,但其接口与所需接口不一致。
2. 需要创建一个可复用的类,该类可与多个不相关的或不可预见的类一起工作。
二、应用场景适配器模式在实际应用中具有广泛的应用场景,以下是几个常见的应用场景:1. 与第三方库的集成当我们使用第三方库时,其提供的接口可能与我们当前系统的接口不兼容,此时可以使用适配器模式来将第三方库的接口转换成我们需要的接口。
2. 兼容性问题当我们需要更新或迁移系统时,可能需要进行接口的变更,这时适配器模式可以用来保持旧的接口兼容性,同时实现新的接口。
3. 数据格式转换在数据处理过程中,可能会面临不同格式的数据,适配器模式可以用来实现不同格式的数据之间的转换,使得系统能够更好地处理数据。
三、实现方法适配器模式可以通过类适配器和对象适配器两种方式来实现。
1. 类适配器类适配器使用多重继承来实现适配器功能。
它继承了原始类,并实现了目标接口。
通过在适配器类中调用原始类的方法来实现接口的转换。
2. 对象适配器对象适配器使用组合来实现适配器功能。
它持有原始类的实例,并实现了目标接口。
通过调用原始类实例的方法来实现接口的转换。
四、示例代码下面是一个使用对象适配器实现适配器模式的示例代码:```java// 目标接口interface Target {void request();}// 原始类class Adaptee {void specificRequest() {System.out.println("Adaptee specificRequest");}}// 适配器类class Adapter implements Target {private Adaptee adaptee;Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();}}// 客户端使用class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}}```在上述代码中,通过适配器类Adapter将原始类Adaptee的接口转换成目标接口Target,从而实现了不兼容接口之间的协同工作。
适配器模式(Adapter Pattern)以下内容是我和小组的兄弟学习设计模式我做的课件,我整理出来和大家分享,有不妥之处敬请指出.上次做的桥接模式(Bridge),这次是适配器模式(Adapter).概述:在软件开发过程中,我们要经常要复用我们以前开发的一些“现存对象”,但是这些“现存对象”并不能满足我们新的应用环境。
怎样才能良好的复用这些对象,以满足我们的应用环境,这就是适配器(Adapter)所要解决的问题。
意图:将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
——《设计模式》GOF生活中的例子:在现实生活中,像这种适配器我们经常见到,而且还是经常使用它,如:手机(深信大家都见过),我们手机在充电的时候,不可能直接在220V电源上直接充电,而是手机“充电器”进行转换成手机需要的电压才可以正常充电,否则就不可以完成充电,这个“充电器”就起到了适配的作用。
1.类的Adapter模式结构图类结构图:代码实现:1namespace Adapter_Pattern2{3public interface ITarget4 {5void GetPower();6 }7///<summary>8/// 220V电源类;9///</summary>10public class Power11 {12///<summary>13///从电源中得到220V的电压; 14///</summary>15public void GetPoer220V()1718 }19 }20///<summary>21///适配器类(充电器);22///</summary>23public class Adapter : Power, ITarget24 {25///<summary>26///得到想要电压;27///</summary>28public void GetPower()29 {30this.GetPoer220V();31 Console.WriteLine("得到手机的充电电压!");32 }33 }客户端调用:1namespace Adapter_Pattern2{3class Program4 {5///<summary>6///这里相当于是手机;7///</summary>8///<param name="args"></param>9static void Main(string[] args)10 {11 Console.Write("手机:");12 ITarget Target = new Adapter();13 Target.GetPower();14 Console.Read();16 }17}特点:它使用多继承的方式来实现,我们只需要调用得到电压(GetPower())方法,由充电器(Adapter)去将220V的电压转成我们需要的电压供我们使用。
结构型设计模式结构型设计模式包括:适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式。
1、适配器模式当需要使⽤⼀个现存的类,但它提供的接⼝与我们系统的接⼝不兼容,⽽我们还不能修改它时,我们可以将⽬标类⽤⼀个新类包装⼀下,使新类的接⼝保留原接⼝模式,但实际上使⽤的是⽬标类的接⼝。
⽐如我们系统中原来的⽇志接⼝为MyFactory,现在要使⽤新的⽇志库NewFactory,其写⽇志的接⼝与我们原来的接⼝不同,但我们⽆法修改新⽇志库的代码,所以可以包装⼀下新的⽇志库类来使⽤://原来的⽇志接⼝public interface MyFactory {void log(String tag, String message);}//新的⽇志接⼝public interface NewLogger {void debug(int priority, String message, Object ... obj);}public class NewLoggerImp implements NewLogger {@Overridepublic void debug(int priority, String message) {}}//⽇志适配器类public class LogAdapter implements MyFactory {private NewLogger nLogger;public LogAdapter() {this.nLogger = new NewLoggerImp();}@Overridepublic void log(String tag, String message) {Objects.requireNonNull(nLogger);nLogger.debug(1, message);}}View Code2、桥接模式现在有⼀个形状类Shape,其⼦类有圆形Circle和⽅形Square,如果我们想要扩展⼦类使其包含颜⾊的话,可以增加红⾊圆形孙⼦类、蓝⾊圆形孙⼦类和红⾊⽅形孙⼦类、蓝⾊⽅形孙⼦类,如下图所⽰。