设计模式
Erick_Lv
菜鸡互啄
展开
-
Reactor和Proactor模式
简介Reactor和Proactor都是基于事件的并发模型。除了基于事件外,还有基于线程的并发模型。这里先简单介绍下两种的特点以及区别。基于线程的模型主要有两种模型:每个客户端的连接分配一个线程,每个线程独立的处理连接。有一个线程池,每个客户端的生命周期都拥有一个线程。可以看出,这两种方式的核心思想都是,每个连接,都独立地拥有一个线程,这个线程伴随着该连接的整个生命周期。这种方式...原创 2020-02-19 22:51:55 · 262 阅读 · 1 评论 -
策略模式
模式简介原创 2019-01-08 18:06:44 · 119 阅读 · 0 评论 -
适配器模式
模式简介该模式的最主要作用是统一不同类的接口,方便客户统一调用。首先说明几个概念,适配器Adapter是用来包装适配者Adaptee的。适配器Adapter本身不提供用户需要的功能,而是适配者Adaptee已经有用户需要的功能了。适配器Adapter仅仅是把适配者Adaptee的接口包装一下,方便客户进行统一调用。模式实现需要有一个适配器的类用于封装接口,其内部包含适配者的基类,作为适配的对...原创 2019-06-12 18:52:50 · 205 阅读 · 0 评论 -
装饰器模式
模式简介个人认为这是一个比较难理解的模式,给出一个背景实例进行说明。 假设我们有Transportation这个运输工具的抽象类,它有一个抽象的方法transform表示运输功能。现在,有三种运输工具,分别是Car、Aircraft和Ship,它们分别实现了自己的运输功能。transform仅仅是表示运输,不会完成装载和卸载货物的功能,我们需要自己实现装卸货物的功能,而整个运输流程包括运输过程和...原创 2019-06-12 23:16:15 · 235 阅读 · 0 评论 -
代理模式
模式简介代理模式最熟悉的应用就是“科学上网”了。比如我们想要访问“油管”(YG),但是很不幸,在国内有“长城”(W),我们是没有权限访问油管的IP(YIP)的。那么换一个代理的思路,虽然我们不能直接访YIP,但是我们可以访问其他没有被封锁IP的服务器,比如自己搭建一个服务器SIP。这样,我们先把请求发送给国外的SIP(肯定是加密访问的),之后SIP再把我们的请求转发给YIP,YIP不知道SIP是...原创 2019-06-13 08:55:57 · 247 阅读 · 0 评论 -
关于适配器模式、装饰器模式、桥接模式和代理模式的总结
这4个设计模式有很多的相同点,比较容易混。在这里写一篇笔记总结下。回顾下4个模式:适配器模式:https://blog.csdn.net/qq_35976351/article/details/91582699装饰器模式:https://blog.csdn.net/qq_35976351/article/details/91653520桥接模式:https://blog.csdn.net...原创 2019-06-13 11:21:34 · 490 阅读 · 0 评论 -
外观模式
模式简介该模式非常容易理解,就是通过一个类来风不封装一下用户和各个子系统的交互,使得用户只需要和外观类进行交互即可。比如我们启动一个系统,需要启动子系统A、子系统B…、子系统Z的各自方法,那么只需要封装一个Facade类,让这个类统一开启这些子系统的方法即可。基本实现#include <iostream>class SubsystemA {public: void ...原创 2019-06-13 14:17:24 · 115 阅读 · 0 评论 -
原型模式
模式简介当一个对象需要完全拷贝另一个对象的状态时,需要使用这个模式。此时,拷贝的新对象和原来的对象拥有同样的行为状态。这么做的优势是,新建对象的时候,我们不需要人工把新对象改变到原来对象的状态,而是复制函数帮我们处理完毕了。这个模式一般用在那些需要克隆有特定状态的对象。比如一个对象当前存储了某些特定的数值,这些值非常多而且复杂,那么此时就可以使用这个模式了。C++中通过拷贝构造函数来实现。模...原创 2019-06-11 11:10:19 · 298 阅读 · 0 评论 -
状态模式
模式简介状态模式用于一个对象在不同上下文中,同一个动作有不同表现形式的情景。这个模式的核心是抽象出某些在不同情景下,会发生变化的方法,然后把这些方法单独封装出接口类,之后我们需要实现不同情景下的不同方法即可。状态模式抽象出了不同状态下,统一的行动接口,子类根据情景不同,具体实例化这些行动类,简化了大量使用条件判断的情景。这个模式有个缺陷,如果我们要增加新方法,那么需要修改所有继承状态的子类,有...原创 2019-06-16 23:08:05 · 316 阅读 · 0 评论 -
备忘录模式
模式简介实现方式UML类图代码实例原创 2019-06-17 12:00:12 · 104 阅读 · 0 评论 -
访问者模式
模式简介有些时候,我们需要遍历所有的元素,但是对具体元素的访问方式存在差异。但是,我们不能直接改变类内部的结构,否则就违反了开闭原则了。举个例子,假设我们有一个抽象商品类Product,其他所有的商品都必须继承自这个抽象类。现在需要进行结帐服务,那么肯定要遍历整个购物车中的物品,然后对不同的产品进行结帐服务。但是,问题在于,不同的产品结帐的方式是不同的,比如书是按本卖的,零食可能是按千克卖的。如...原创 2019-06-18 12:56:18 · 604 阅读 · 0 评论 -
中介者模式
模式简介顾名思义,这需要一个中介的类来处理问题。最典型的就是路由器和各个主机的关系。在非P2P的模式下,我们都是通过一个路由器来和各个主机之间进行通信,而不是直接与各个主机进行链接。这样有个好处是,主机之间的关联变得很小,只需要通过路由器进行通信即可。但是,这样做也有一定的缺陷,如果主机很多,那么路由器会变得很复杂,这一点类比到软件工程上也是类似的。该模式一般不要乱用,除非是类之间的通信出现了复...原创 2019-06-18 13:43:22 · 111 阅读 · 0 评论 -
单例模式
模式简介原创 2019-01-08 17:43:19 · 113 阅读 · 0 评论 -
桥接模式
模式简介当系统有两个维度的变化时,使用桥接模式减少类的个数。该模式的核心思想是把类的继承变成类的组合。模式实现interface Implementor { public void operationImpl();};abstract class Abstraction { protected Implementor impl; public void set...原创 2019-01-13 11:30:24 · 204 阅读 · 0 评论 -
责任链模式
模式简介用户发起一个请求,之后请求上链,如果当前处理者可以处理该请求,那么就直接处理;否则当前处理者把请求转发给下一个处理者。一般来说,责任链有直线、环状和树型的,不过最常见的是直线类型的。用户不用管具体的责任链的处理步骤,只需要把请求加入责任链即可,这样请求的发送者和请求的处理者就可以解耦了。模式实现Hanlder:请求处理者,纯虚基类。ConcreteHanlder:具体请求处理者,...原创 2019-01-12 21:00:05 · 153 阅读 · 0 评论 -
UML类图
关联关联类之间的关系是平等的,这与聚合、组合有不同。其中一个类作为另一个类的成员变量,默认情况下时双向关联的。如果时单向关联,需要由箭头指向被包含方单向关联UML表示为: Java代码表示:public class Customer{ private Address address; /* ....... */}public cl...原创 2018-04-24 23:56:27 · 1068 阅读 · 0 评论 -
建造者模式
模式动机与定义复杂的对象由多个部分组成,建造者模式吧部件和其组装过程分开,一步步创建复杂的对象。建造者返还给客户端的是一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式。建造者模式允许用户通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部具体的构建细节。模式结构与分析UML分析 角色:Builder:抽象建造者。定义了产品的创...原创 2018-05-02 23:27:36 · 204 阅读 · 0 评论 -
7个设计模式的基本原则
单一职责原则一个类(或者大到模块,小到方法)承担的职责越多,它被复用的可能性越小。类的职责表现在数据职责和行为职责。前者通过属性体现,后者通过方法体现。高内聚、低耦合。把不同的职责分离成不同的类。类不要过于庞大。开闭原则对扩展开发,对修改关闭。设计一个模块的时候,使得该模块可以在不被修改的前提下进行扩展。一般使用抽象化的设计原则。扩展的时候,仅仅是对抽象类的一个实现与扩展。抽象化是...原创 2018-04-25 10:04:55 · 707 阅读 · 0 评论 -
设计模式概述
设计模式分类依据目的分类创建型 创建对象 结构型 处理对象和类的组合 行为型 描述类和对象的交互和分配职责的方式。设计模式的分类类模式 处理类和子类的关系,这些 关系通过继承建立,在编译时确定,是静态的。 对象模式 处理对象的关系,关系在运行时刻变化,是动态的分类图示: ...原创 2018-04-25 23:26:36 · 140 阅读 · 0 评论 -
简单工厂模式
动机需要使用的对象都来自于同一个基类。比如按钮有各种形状的,但是它们都来自与按钮这个基类。不需要知道具体的对象名,只需要知道有合适的参数,传入参数即可调用需要的方法。定义简单工厂模式可以根据参数的不同返回不同类的实例。专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。结构Factory:工厂角色Product:抽象产品角色Concrete Pr...原创 2018-04-26 23:39:00 · 2388 阅读 · 2 评论 -
工厂方法模式
动机为了解决简单工厂模式中,抽象工厂不满足开闭原则的缺陷。不在创建一个抽象的工厂类完成所有的产品的创建,而是把具体产品的创建过程交给专门的工厂的子类去完成。可以先定义生产抽象类的抽象工厂,再定义具体的工厂类来生产具体的产品。可以在不修改具体工厂类的情况下引入新的产品,更加符合开闭原则。简单地理解为单独建立一个抽象工厂,专门用于生产接口。之后根据需要,建立抽象工厂的子类,让这些子类完成具体的...原创 2018-04-28 23:37:20 · 187 阅读 · 0 评论 -
组合模式
模式简介组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。同时容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构。模式实现// 抽象构建角色代码abstract class Component { ...原创 2019-01-17 17:12:03 · 607 阅读 · 0 评论 -
观察者模式
模式简介这是一种对象和对象之间的依赖关系,有一个观察目标和一系列的观察者。如果观察目标的状态发生了变化,那么观察目标将会通知一系列的观察者。观察者的数量可以根据实际情况进行增减,方便扩展。注意一个思维上的误区:如果观察目标的状态发生了变化,那么是观察目标调用观察者的函数,这个过程称为通知;观察者本身不会感知观察目标的变化!!!模式实现观察目标:一个纯虚基类,用于通知观察者状态发生变化观...原创 2019-01-12 18:38:34 · 119 阅读 · 0 评论 -
MVC模式
模式简介MVC模式是一种架构模式,它包含三个角色:模型(Model),视图(View)和控制器(Controller)。观察者模式可以用来实现MVC模式,观察者模式中的观察目标就是MVC模式中的模型(Model),而观察者就是MVC中的视图(View),控制器(Controller)充当两者之间的中介者(Mediator)。当模型层的数据发生改变时,视图层将自动改变其显示内容。模式实现Mo...原创 2019-01-12 19:37:28 · 1390 阅读 · 0 评论 -
迭代器模式
模式简介迭代器模式对用户暴露迭代的接口,隐藏具体内部的实现。最常用的例子是C++ STL的迭代器或者Java的迭代器,在实际编程中,很少自己定义,一般都是调用系统自带的迭代器。该模式特别常用,因此不在赘述,只是一个泛型迭代器而已...原创 2019-01-12 19:49:55 · 110 阅读 · 0 评论 -
抽象工厂模式
动机首先,引入产品等级和产品族的概念。产品等级表示产品的继承结构,比如一个抽象类是汽车,那么宝马、奔驰、保时捷等品牌的汽车都继承于汽车这个抽象类,它们形成了一个产品等级,汽车是父类,各个品牌是子类。产品族表示由一个工厂生产的,位于不同等级结构中的一组产品。比如,保时捷公司旗下不仅仅有汽车产品,还有手机、自行车等,这些形成了一个产品族。当系统提供的工厂需要生产位于不同产品等级属于不同类型...原创 2018-04-30 23:34:21 · 923 阅读 · 0 评论