
设计模式
文章平均质量分 74
超級码力
Keep Reading , Keep Writing , Keep Coding.
展开
-
设计模式 -- 单例模式(Singleton)
单例模式Singleton模式解决问题十分常见而且比较简单。那么什么是单例模式呢?其实就是创建一个唯一的类对象,内存中只占有一份。那么问题来了,要怎么创建一个唯一对象呢?当然,直接定义一个全局的对象可以实现,但在有些纯粹的面向对象语言中,如C#,jave中,就不能定义全局变量了。那么,除了全局变量还有什么是唯一性的呢?恩,没错,就是static静态变量。我们的单例模式就是通过一个静态的类成员函数实现原创 2015-11-13 10:45:46 · 7534 阅读 · 0 评论 -
重返设计模式--单例模式
要点理论什么是单例模式:保证一个类只有一个实例,并且提供了访问该实例的全局访问点。要点: 1,单例模式核心就两个:只有一个实例和静态全局。 2,尽量少用单例模式。单例模式作为一个全局的变量,有很多全局的变量的弊病。它会使代码更难理解,更加耦合,并且对并行不太友好。 3,单例模式它同时解决了两个问题:保证一个实例和全局访问点,但往往我们只需要其中一个特性。策略是以后会介绍的子类沙箱模式通过对原创 2017-02-13 17:02:09 · 468 阅读 · 0 评论 -
行为模式--字节码
理论要点什么是字节码模式:将行为编码为虚拟机器上的指令,来赋予其数据的灵活性。从而让数据易于修改,易于加载,并与其他可执行部分相隔离。要点 1,字节码模式:指令集定义了可执行的底层操作。一系列的指令被编码为字节序列。 虚拟机使用中间值堆栈依次执行这些指令。 通过组合指令,可以定义复杂的高层行为。2,可以理解为项目中的转表工具,将excel中的数据转为二进制数据,并读取到工程中。还有如在项目中原创 2017-03-03 11:23:50 · 2432 阅读 · 2 评论 -
序列模式--双缓冲模式
理论要点什么是双缓冲模式:用序列的操作模拟瞬间或者同时发生的事情。通俗地讲就是一个后台缓冲来接受数据,当填充完整后交换给前台缓冲,这样就保证了前台缓冲里的数据都是完整的。要点: 1,一个双缓冲类封装了一个缓冲:一段可改变的状态。这个缓冲被增量的修改,但我们想要外部的代码将其视为单一的元素修改。 为了实现这点,双缓冲类需保存两个缓冲的实例:下一缓存和当前缓存。2,当信息从缓冲区中读取,原创 2017-02-24 11:16:51 · 1790 阅读 · 0 评论 -
行为模式--子类沙箱
理论要点什么是子类沙箱:用一系列由基类提供的操作定义子类中的行为。通俗地讲就是把公共的操作都封装进基类,子类不直接与外部其它模块耦合,把耦合集中到基类统一处理。要点:基类定义抽象的沙箱方法和几个提供操作的实现方法,将他们设为protected,表明它们只为子类所使用。每个推导出的沙箱子类用提供的操作实现了沙箱方法。使用场合: 子类沙箱模式是潜伏在编程日常中简单常用的模式,哪怕是在游戏之外的原创 2017-03-06 15:45:12 · 890 阅读 · 0 评论 -
解耦模式--组件模式
理论要点代码分析1,还记得经典丹麦面包师Bjorn游戏么?我们这里也将用这个来作为示例来分析组件模式的运用:我们会有一个类来表示友好的糕点厨师,同时这个类还包含他在比赛中做的一切行为。由于玩家控制他,这意味着需要读取控制器的输入然后转化为动作。 而且,他需要与关卡相互作用,所以要引入物理和碰撞。 一旦这样做了,他必须在屏幕上出现,所以要引入动画和渲染。 他可能还会播放一些声音。下面我们原创 2017-03-10 18:15:46 · 1398 阅读 · 0 评论 -
行为模式--类型对象
理论要点什么是类型对象:创造一个类A来允许灵活的创造新的类,而类A的每个实例都代表了不同类型的对象。通俗地讲就是定义一个类型对象类和一个有类型的对象类。每个类型对象实例代表一种不同的逻辑类型。每种有类型的对象保存描述它类型的类型对象的引用。要点: 1,类型对象的基本思想就是给基类一个品种类(breed类),而不是用一些子类继承自这个基类。所以我们在做种类区分的时候就可以只有两个类,怪物类mon原创 2017-03-07 18:02:26 · 2069 阅读 · 0 评论 -
解耦模式--服务定位器
理论要点什么是服务定位器模式:提供服务的全局接入点,而不必让用户和实现它的具体类耦合。通俗点讲就是服务类定义了一堆操作的抽象接口,具体的服务提供者实现这些接口。分离的定位器来管理服务类,外部就是通过这个定位器对象来间接获取服务。要点 1,一般通过使用单例或者静态类来实现服务定位模式,提供服务的全局接入点。和单例模式很像,只是多了一个间接获取服务对象的中间管理类。不让用户直接接触具体服务类。2,原创 2017-05-05 17:47:29 · 1135 阅读 · 0 评论 -
解耦模式--事件队列
理论要点什么是事件队列模式:对消息或事件的发送与处理进行时间上的解耦。通俗地讲就是在队列中按先入先出的顺序存储一系列通知或请求。 发送通知时,将请求放入队列并返回。 处理请求的系统之后稍晚从队列中获取请求并处理。 要点 1,事件队列其实可以看做观察者模式的异步实现。 2,事件队列很复杂,会对游戏架构引起广泛影响。中心事件队列是一个全局变量。这个模式的通常方法是一个大的交换站,游戏中的每原创 2017-04-25 14:25:25 · 2269 阅读 · 0 评论 -
优化模式--数据局部性
理论要点什么是数据局部性模式:合理组织数据,充分使用CPU的缓存来加速内存读取。简单点说就是让数据在内存中连续存储,这样可以加快CPU的访问速度。要点 1, 现代的CPU有缓存来加速内存读取,其可以更快地读取最近访问过的内存毗邻的内存。基于这一点,我们通过保证处理的数据排列在连续内存上,以提高内存局部性,从而提高性能。2,为了保证数据局部性,就要避免的缓存不命中。也许你需要牺牲一些宝原创 2017-06-12 22:35:19 · 2319 阅读 · 1 评论 -
重返设计模式--原型模式
理论要点什么是原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。通俗的讲就是指定一个对象作为模板,然后用这个模板克隆出新对象。注意点: 1 ,使用原型模式拷贝对象时,需注意浅拷贝与深拷贝的区别。 2,原型模式可以结合JSON等数据交换格式,为数据模型构建原型。 3,有时原型模式庞杂的类层次管理起来很痛苦, 这就是我们为什么用组件模式和类型对象为不同的实体建模,这样无原创 2017-02-13 12:30:03 · 423 阅读 · 0 评论 -
序列模式--更新方法
理论要点什么是更新方法模式:通过每次处理一帧的行为模拟一系列独立对象。通俗地讲就是每帧更新游戏中我们看到的所有对象的方法(npc,monster,player…)。要点 1,更新方法模式:在游戏中保持游戏对象的集合。每个对象实现一个更新方法,以处理对象在一帧内的行为。每一帧中,游戏循环对集合中的每一个对象进行更新。2,当离开每帧时,我们也许需要存储下状态,以备不时之需。使用场合原创 2017-03-01 11:10:53 · 2071 阅读 · 0 评论 -
设计模式 -- 工厂模式(Factory)
工厂模式先来看看这样一个情形:假设我们在做一款大型多人在线网游,里面的怪物有成百上千种,这时怪物类我们很容易想到用多态去实现。即抽象出怪物共有属性,不同怪物类都继承这个基类。好,如果怪物类就这么封装,那么在需要怪物的地方都要new XX怪物类,那么会有几个这样的问题,1,客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了 处理可能的名字冲突,有的命名可能并不是具有很好原创 2015-10-29 18:27:16 · 3444 阅读 · 1 评论 -
设计模式 -- 抽象工厂模式(AbstactFactory)
抽象工厂模式抽象工厂模式其实是通过工厂模式实现的,也可以说是工厂模式的扩展。那什么是抽象工厂模式呢?好,先来看看这样一个问题:假设我们玩一个横版过关的游戏,当前关卡有好几类怪物(如:精灵类,人族,鬼…),每类怪物都有好几十只,那么这种场景对象的创建我们也应该像工厂模式一样把其封装起来管理。抽象工厂模式和工厂模式的区别就是,抽象工厂类是管理一组基类对象,而工厂类只是管理一类基类对象。下面再来看看其结构原创 2015-11-02 17:09:34 · 2259 阅读 · 0 评论 -
设计模式 -- 状态模式(State)
理解状态模式一般运用在一个对象在某些条件下能触发一些不同的行为的情形。其实系统开发中到处都充斥着这些情形,初学者往往都是习惯性的用面向过程的思维方式解决问题,往往看到模块中if .. else .. 嵌套很多时,就要想想这些设计是否合理了。这种以条件判断来维护对象状态的设计至少会带来以下两个问题: 1、当状态数目不是很多的时候,Switch/Case可能可以搞定。但是当状态数目很多的时候(实际系原创 2016-06-26 15:39:45 · 3614 阅读 · 0 评论 -
设计模式 -- 前言
我们是不是都有过这样的经历:有时阅读一些大牛的代码或学习一些开源项目时,常常感慨人家框架怎么设计的这么好,扩展方便,改动少等,代码写得这么优雅,要是自己能想到这样实现吗?想想大学那时自己刚写项目的经历,常常写着写着发现没法写下去了,各模块内部牵扯太多,很难扩展等,重构了很多次,也踩过很多坑。 那么设计模式就是讲如何避免这些坑,如何设计更合理的框架,写出更优雅的代码而产生的。什么是设计模式原创 2015-11-04 13:57:59 · 1942 阅读 · 0 评论 -
重返设计模式--命令模式
理论要点什么是命令模式:“将一个请求封装成一个对象,从而允许你使用不同的请求、队列或日志将客服端参数化,同时支持请求操作的撤销与恢复。” 通俗讲就是把方法的调用封装进对象中去回调。优缺点:对类间解耦、可扩展性强、易于命令的组合维护、易于与其他模式结合,而缺点是会导致类的膨胀。使用场景: 1,命令模式很适合实现诸如撤消,重做,回放,时间倒流之类的功能。 2,基于命令模式实现录像与回放等功能,原创 2017-02-08 00:12:45 · 542 阅读 · 0 评论 -
重返设计模式--享元模式
理论要点什么是享元模式:以共享的方式高效地支持大量的细粒度的对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。通俗的讲就是很多对象共享同一块内存数据。(注意区别单例模式:享元强调共享内存,单例强调只有一个实例,它是全局的,单例可以说是特殊的享元)享元模式有两种状态:固有状态和变化状态 1,固有状态,是不会随环境改变而改变的,是存储在享元对象内部的状态信息,因此固有状态是可以共享原创 2017-02-08 15:54:41 · 483 阅读 · 0 评论 -
重返设计模式--状态模式
理论要点什么是状态模式:允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。通俗点总结就是:一个对象存在很多状态,这些状态可以通过外部输入而转移到另一个状态。即状态,输入,转移就是此模式的全部核心了。要点: 1,你拥有状态机所有可能状态的集合。 2,状态机同时只能在一个状态。 3,一连串的输入或事件被发送给状态机。 4,每个状态都有一系列的转移,每个转移与输入和另一状态原创 2017-02-16 23:34:28 · 664 阅读 · 0 评论 -
重返设计模式--观察者模式
理论要点什么是观察者模式:观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。通俗点讲就是一方发送某条消息,其它只要注册了这条消息的对象都会收到通知。其中我们把发送方称为被观察者,接受方称为观察者。要点: 1,我们知道,将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一原创 2017-02-10 00:04:17 · 469 阅读 · 0 评论 -
序列模式--游戏循环模式
理论要点什么是游戏循环模式:将游戏的进行和玩家输入解耦,和处理器速度解耦。即每个游戏必有的主循环update的实现。要点:关键点就是实现如何控制游戏的速度(帧率)和CPU负荷与游戏效果之间权衡。使用场合:任何游戏或游戏引擎都拥有自己的游戏循环,因为游戏循环是游戏运行的主心骨。代码分析1,下面我们试着一步步来实现一个游戏循环模式,看看我们游戏之所以能一直运行更新,底层到底是怎样驱使的呢? 先原创 2017-02-28 18:48:24 · 989 阅读 · 1 评论 -
优化模式--脏标记模式
理论要点什么是脏标记模式:将工作推迟到必要时进行以避免不必要的工作。就是用一个标志位来标记内容是否发生变化,如果没有发生变化就直接使用缓存数据,不需要重新计算。要点 脏标识模式:当前有一组原始数据随着时间变化而改变。由这些原始数据计算出目标数据需要耗费一定的计算量。这个时候,可以用一个脏标识,来追踪目前的原始数据是否与之前的原始数据保持一致,而此脏标识会在被标记的原始数据改变时改变。那么,若这原创 2017-10-14 22:51:18 · 4609 阅读 · 0 评论