6. 设计模式
文章平均质量分 55
持续更新,将使用基础样例介绍20种设计模式
Lzg_na
这个作者很懒,什么都没留下…
展开
-
设计模式16——适配器
文章目录1. 动机2. 模式定义3.代码1. 动机当应用的环境发生变化时,原有的接口可能不再适合新环境.2. 模式定义将一个类的接口转换为客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作.3.代码/* 目标接口(新接口) */class newInterface{public: virtual void process()=0;};/* 遗留接口(老接口) */class oldInterface{public: vi原创 2022-03-27 21:58:06 · 1341 阅读 · 0 评论 -
设计模式14-门面模式
文章目录1. 动机2. 好处3. 结构1. 动机 某些接口之间的直接依赖可能会有问题,甚至根本不可行。采用添加一层间接的接口来隔离本来相互紧密联系的接口是很好的方式.比如:操作系统作为应用程序和硬件之间的接口。2. 好处 从上面图中,我们可以看到采用一个中间结构,相当程度减少了模块之间的交互,减少的交互就不需要我们再为其维护接口的变化. 这一点很重要,不仅仅是维护其变化,有时代码有改动,而某处有依赖的地方没有更改时,程序很容易出现问题。 我们希望下层模块的变化,不应让上层感知到原创 2022-03-26 00:21:55 · 399 阅读 · 0 评论 -
设计模式1——模板方法(template method)
在软件构建过程中,对于某一项项目,他常常有稳定的整体结构,(即程序的整体框架是固定的,但是各个函数的实现细节可能会变化或者多个细节的版本)。或者由于固有的原因而无法和任务的整体结构同时实现。那么问题就来了,如何应对这种多个版本的子函数呢?在传统的结构化软件设计流程如下://程序库开发人员class Library{public: void Step1(){ //... } void Step3(){ //... } void Step5(){ //... }};/原创 2020-08-05 10:47:28 · 260 阅读 · 0 评论 -
设计模式4——策略模式
在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都包装在对象中,可能会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。模式定义:定义一系列算法,把他们一个个封装起来,并且使他们可互相替换。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。下面以一个例子说明:各个国家的税收标准都不一样,我们定义了一个枚举类型,在CalculateTax()中根据传进来对象的tax属性选择if else语句:enum TaxBase { CN_Tax原创 2020-08-05 14:55:12 · 140 阅读 · 0 评论 -
设计模式5——观察者模式(Observer)
观察者模式动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象的状态改变,所有的依赖对象(观察者对象)都能将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好的抵御变化。使用面向对象的技术,将这种依赖关系弱化,形成稳定的依赖关系,实现松耦合。模式定义定义一种对象之间的一对多的依赖关系,以便当一个对象的状态改变时,所有依赖于它的对象都得到通知并自动更新。——《设计模式》GoF例子要实现一个文件分割的功能,就是将一个大的文件分割为几个小的文件;在窗口处理程序中,点击原创 2020-08-06 11:15:49 · 106 阅读 · 0 评论 -
设计模式6——装饰模式
1. 动机继承是C++非常重要的特性,在某些情况下,我们可能过度使用继承来扩展对象的功能,每次继承导致子类越来越来,带来二叉树式类的膨胀。那么如何解决子类膨胀问题呢???2. 模式定义动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比继承更为灵活。 ——《设计模式》GoF3. 举例基类Stream对应三个操作的虚函数;FileStream和NetworkStream继承自Stream并重写虚函数;CryptoFileStream和 CryptoB原创 2020-08-07 14:40:01 · 106 阅读 · 0 评论 -
设计模式7——桥模式
动机由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化。如何让轻松应对“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?模式定义将抽象部分(业务功能)与实现部分(平台实现)分离,使他们都可以独立变化——《设计模式》GoF案例设计一个用于发送消息的平台,在基类定义了各种虚函数class Messager{public: virtual void Login(string username, string原创 2020-08-09 10:49:37 · 95 阅读 · 0 评论 -
设计模式8——工厂方法(Factory Method)
一、动机在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?二、模式定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。——《设计模式》GoF三、例子同样是文件分割的类,基类为纯虚函数,四个继承于基类的类对应于分割不同类型的文件。class ISplitter{p原创 2020-08-10 10:31:11 · 207 阅读 · 0 评论 -
设计模式9——抽象工厂
动机 在软件设计中经常面对一系列相互依赖的对象的创建工作,由于需求变化,经常面对更多对象的创建工作。1. 引入问题代码如下:class EmployeeDB{public: vector<EmployeeInfo> GetEmployee() { /* 创建SQL对象,建立初始网络连接 */ SqlConnect *connection = new SqlConnection(); connection->ConnectNet("ip:192.168.0.1"原创 2022-03-21 23:41:14 · 746 阅读 · 0 评论 -
设计模式10——原型模式(protype)
“对象创建模式”通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合,从而支持对象创建的稳定。它是接口抽象之后的第一部工作。动机在软件系统中,有时候面临着“一个复杂对象“的创建工作其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种”封装机制”来隔离出“复杂对象的各个部分“的变化,从而支持系统中”稳定构建算法”不随着需求改变而改变?模式定义将一个复杂对象的原创 2020-08-17 11:31:42 · 1373 阅读 · 0 评论 -
设计模式12——单例模式(Singleton)
单例:通过一个对象只能创建一个该类的实例。当然,可以创建两个指针指向该实例。应用场景:比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。其他还有如系统的日志输出、MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘等等。当需要频繁调用该类时,单例类可以保证无需重复创建,节省资源。单例类实现1、懒汉模式;2、饿汉模式原创 2020-08-04 21:26:29 · 198 阅读 · 0 评论 -
设计模式13——享元模式(flyweight)
动机在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?模式定义运用共享技术有效的支持大量细粒度的对象。——《设计模式》GoF案例我们定义字体类时会使用唯一性标识来说明一个字体对象。class Font {//字体private: string key;//字体唯一标识public: Font(const原创 2020-08-12 11:42:53 · 128 阅读 · 0 评论 -
设计模式15——代理模式(Proxy)
一、动机在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。二、模式定义为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。——《设计模式》GoF三、案例有一个处理函数的基类,process声明为虚函数,然后RealSubject继承基类,并重写虚函数:class ISubject{public: virt原创 2020-08-11 09:59:49 · 139 阅读 · 0 评论 -
设计模式23——命令模式
动机在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”和“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。模式定义将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。——《设计模式》GoF案例定义一个命令的基类Command,并将exec原创 2020-08-12 11:02:54 · 110 阅读 · 0 评论