随笔分类 - 设计模式和UML
摘要:享元模式: 在设计实现包含大量对象的数据结构时,考虑将对象划分为可共享的部分和不可共享的部分,其中可共享的部分共享存储,不可共享的部分单独存储,从而节约存储空间。核心实现: 共享重复的数据。 使用hash_table、set等集合,有效的管理 本质上是一种压缩,是一种处理大数据的方式。适用场景: 对象个数极多 对象之间的重复属性特别多 常用于富格式文本的存储举例说明: 一个地图中,有很多很多用于装饰的植物,如花朵、草丛、仙人掌等等,众多的植物每一个都是一个对象,每个植物对象都有颜色、高度、坐标、当前帧、动画贴图等等,其中动画贴图将占据大量的内存空间。如果不使用享元模式,将会由于...
阅读全文
摘要:原型模式:属于创建型设计模式,直接复制一个已存在的实例作为新实例。背景补充: 创建型的设计模式,都属于工厂,内部实现产生实例的方法,对外开放一个获得实例的接口,将产生实例的方法与客户分离,降低耦合度。 使用原型模式,可以同时使用单例模式产生工厂实例,使用抽象工厂管理生产线,再使用原型模式返回对象。核心实现:实现拷贝构造函数。适用场景:实例非常复杂,设置非常麻烦,实例的初始化非常耗时;试图获得实例的客户并没有设置参数的能力,或者不想花费时间去设置参数。模型类图: 图 1 模型图举例说明:在本例中,同时使用了抽象工厂,单例模式和原型模式:工厂实例是通过单例模式创建的;客户需要的Tank实例是通过原
阅读全文
摘要:桥接模式简介:将抽象部分和实现部分分离,抽象部分的变化无关实现,实现部分的变化也无需通知抽象部分。例如假设一个类有M中抽象子类,实现有N中实现方法,不使用桥接模式的复杂度为O(M×N),而使用桥接模式,对类进行抽象/实现层次划分,之后分别进行抽象类派生和实现方法派生,复杂度为O(M+N)。核心: 极类似于网络中层次的划分,应用层不需要考虑链路设计,上层协议调用下层协议,下层协议为上层协议服务。问题多维,可划分层次;应用层:抽象层;底层:实现层。难点:划分层次:抽象层和实现层,抽象层调用实现层,实现层可以独立设计区别:(个人认为使用顺序应该是:结构型设计模式->创建型设计模型-&
阅读全文
摘要:抽象工厂简介:是一种创建对象的方法,当一个类簇的一种派生类对象需要被创建时,只需提供一个接口,并通过参数指定要创建的对象型号,该工厂即可返回该类型对象的指针。核心: 将客户和生产线分离。一般实现方法:l 工厂存在一个实例,提供N个接口供客户调用,每个接口负责一个类簇;l 工厂依赖全部基类和派生类,并为每一个类簇提供一个接口,当存在N个类簇时,提供N个接口;l 客户依赖全部基类,如非特殊情况,客户不依赖派生类;l 如果需要添加新的类簇,需要修改:工厂生产方法,工厂接口函数,客户的依赖关系。优点:l 访问该工厂的客户只需要知道自己想要的对象的基类和一个型号参数,即可得到正确的对象,操作简单。l 分
阅读全文
摘要:正确的使用设计模式可以减少条件语句,减少代码量,提高复用性。错误的使用,则起不到那样的效果。下面的例子,本想使用策略模式,封装是封装了,可以还是用的状态模式的思路,导致最终没有起到优化的目的。原因还是选错了模式。代码: 1 #include 2 3 /*** 4 * 一个非常不恰当的使用设计模式——策略模式的例子 5 * 看起来就是状态模式和策略模式的杂交,还是畸形 6 * @author:zanzan101 7 */ 8 9 10 class Move 11 { 12 public: 13 // 重载()运算符,使之成为仿函数 14 virtual...
阅读全文
摘要:题目定义:输入为合法的整数四则运算表达式,不带括号,编程计算表达式的运算结果。思路:先设计程序流程图,之后打印出流程图,根据流程图编程实现代码。程序流程图:代码: 1 #include 2 #include 3 4 using namespace std; 5 6 int get_int(const char* &p) 7 { 8 int tmp = 0; 9 while(*p >= '0' && *p stack_value; 49 stack stack_oprtr; 50 while(true) 51 { 52 ...
阅读全文
摘要:最近认真学习了一下设计模式中的一个比较简单的:状态模式,并用它设计了一个极其简单的“登录过程”的代码。状态模式的优势:当系统中存在的状态很多(一般>=4),但状态的相互跳转并不复杂,即每个状态的出度较少(一般为1~3),这种情况下适合用状态模式;状态模式下,状态之间的跳转由状态对象自己负责,每个状态自己知道且只知道自己的跳转方法,这样设计起来简单,系统不需要同样管理状态之间的跳转。状态模式的优点在于能方便的进行状态之间的跳转,修改状态调整规则,以及扩展新的状态;收获如下:要使用设计模式来设计系统的话,需要先画出UML图来,或者是类似的图,比如使用状态模式,就应该先画出类图(静态图)和状态
阅读全文
摘要:学习一下C++的单例模式(Singleton)实现方法,顺便练习一下多线程编程。代码: 1 #include 2 #include 3 4 /*** 5 * @author:zanzan101 6 */ 7 8 class A 9 { 10 public: 11 static A* get_instance() 12 { 13 while(WAIT_OBJECT_0 != WaitForSingleObject(mutex, 0)) 14 Sleep(100); // 设置100毫秒的相应时间 15 16...
阅读全文
浙公网安备 33010602011771号