第十二章 适配器模式和外观模式 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.外观只是提供你更直接的操作,并未将原来的子系统阻隔起来。
如果你需要子系统类的更高层的功能呢,还是可以使用原来的子系统的构造家庭影院外观好了,那接下来就到实战阶段啦。