设计模式大全(C#)
软件开发中某一个模块会实际用到的设计模式作为例子讲解设计模式,而不是凭空的给个不相关的例子说这个就是此模式。
臣定保幼主周全ぃ
这个作者很懒,什么都没留下…
展开
-
设计模式总结(以游戏开发举例)
1.单例模式单例模式有两个模式,确保任何时候对象只有一个,避免重复创建和释放,应用于资源共享和相互通信的情况下。https://blog.csdn.net/m0_37920739/article/details/808696492.工厂模式、工厂方法工厂模式把创建对象集中,使矛盾集中在工厂类中,导致工厂类会高耦合。工厂方法是类创建单独创建它的工厂类,符合开闭原则。https...原创 2020-03-02 10:35:25 · 419 阅读 · 0 评论 -
Unity中使用MVC模式
前言MVC模式是视图层、控制层、模型层代码进行分层开发,视图层只关心UI的变化,控制层获取模型对象,并在数据变化时更新视图,启到统一作用,模型层是获取和更新数据模型的,这样就不必将所有逻辑代码集中一起,看着比较混乱。1.Unity开发时使用MVC正常情况每个UI界面对应一个脚本,把逻辑全部写在一起,这样的话太过臃肿,在Unity开发时可以使用MVC模式去设计游戏框架,这样的话,每个...原创 2020-02-29 02:52:59 · 965 阅读 · 2 评论 -
访问者模式
前言如果数据是稳定不变的,但访问数据的方式可能易变的或需扩展的。可以使用访问者模式,主要是为了对象数据和访问数据方式分离开来。1.游戏分享链接有一天游戏策划跑过来和你说:嘿,伙计,把游戏的添加上分享功能模块吧,毕竟最好的推广方式是玩家与玩家之间的。把游戏活动分享到微信,需要先接入微信提供的工具开发包,然后敲一下代码调用即可,具体代码如下: public enum Sha...原创 2020-02-28 18:11:48 · 139 阅读 · 0 评论 -
模板方法模式
前言模板方法模式和空对象模式刚刚相反,是经常使用的模式,可能经常用到也不知道它原来叫模板模式。1. 什么是模板方法模式?这篇就当水文章了,实在想不到这个经常使用到的设计模式,我可以写出什么花里胡哨的东西,而且使用的地方也太多了,写这篇主要是为了完成九九八十一难的其中一难,毕竟其他设计模式都写好了。模板方法是什么?随便找个之前写过的设计模式文章里基本都隐藏的模板方法模式,主要是封装不...原创 2020-02-27 22:41:17 · 178 阅读 · 0 评论 -
策略模式
前言不知道各位有没有玩过三国杀,这里将用策略模式去模拟三国杀游戏,各位看完一定会感觉很生动形象的????,之后就是比较策略模式,状态模式,桥接模式什么同异。1.策略模式模拟三国杀手牌大部分功能相似的情况下(功能相同的情况下,调用函数时的参数也要相同),使用分支语言将带来复杂和难以维护的问题,所以每个玩家手里一堆牌,可以用策略模式相当于目标对象持有很多个策略类,只不过网上给出的例子都是目标...原创 2020-02-27 20:35:05 · 224 阅读 · 0 评论 -
状态模式
前言当类属性的某个属性发生改变时允许改变其内部的行为,导致对象看起来像修改了它的类。1.Unity的动画状态机没有用过Unity动画状态机的小伙伴,这里先简单的讲解一下,就是可以通过可视化界面设置每个动画状态之间跳转的关系,可能用过的人感觉好神奇,但是Unity又不是开源,所以这里就尝试实现一下Untiy动画状态机模块,先给你们看看动画状态机的配置界面吧,让各位混个脸熟,具体如图所...原创 2020-02-26 23:36:53 · 441 阅读 · 0 评论 -
空对象模式
前言空对象模式基本上用到的很少,空对象去取代Null,主要目的是当数据不可用时提供一种默认的处理方式。1.不用空对象模式处理意外情况一般空对象模式是防止意外情况,导致无法获取到对象情况下可以触发默认方式。说实话感觉这个设计模式的使用场景很少很少,但是还是简单的讲解一下,首先模拟一个会用到空对象模式的场景,具体代码如下: public enum SDKType {...原创 2020-02-26 19:24:33 · 303 阅读 · 0 评论 -
观察者模式
前言这篇文章将讲述消息监听方案的发展史,来阐述观察者模式的优点。本篇文章的故事纯属虚构,如有雷同只是巧合,前排拿好瓜子和板凳准备开始了。1.很久以前的消息监听方案记得很久很久以前,一群程序员准备构建游戏网络模块的框架时,思考了良久,他们终于决定准备把全部监听消息的操作都集中在SocketManger类里,相当于使用中介者模式去实现消息分拨的功能,然后他们满意的点点头开始写代码了,...原创 2020-02-25 23:27:45 · 330 阅读 · 0 评论 -
备忘录模式
前言不知诸君有没有看过我写的命令模式实现的操作前进和回滚的效果,其实备忘录的主要目的也是这个,但是实现的方式不同,这里将讲解一下这两种方式的区别。1.备忘录实现回滚和前进没有看过命令模式实现操作前进和回滚的,建议去看看,传送门:https://blog.csdn.net/m0_37920739/article/details/104428753 看完以后,有看过其他网站写的备...原创 2020-02-25 17:39:15 · 260 阅读 · 0 评论 -
中介者模式
前言当看到一个类有很多复杂的对象引用和相互调用的时候,导致代码变得很乱,这个时候就可以使用中介者模式去解决这个问题,比较典型的例子就是MVC。1.简单说明中介者模式中介者模式主要是解决对象之间相互引用和调用,导致结构很混乱很复杂。比如游戏引擎模块之间的相互关系,一定是有超级复杂的相互关联的问题,这里使用中介者模式来模拟一下解决游戏UI模块和Sound模块复杂的关系,通过这个设计模式...原创 2020-02-24 22:25:38 · 183 阅读 · 0 评论 -
迭代器模式
前言C#中数据结构都实现了迭代器的功能,具体是如何实现的,接下来就由此篇文章去介绍一下C#是如何实现迭代器的,从使用C#自身提供的接口再到从0到1架构出迭代器。1.使用C#接口实现迭代器随便找一个用C#实现的数据结构,比如看看列表是如何实现的迭代器功能的,其实网上资料说要实现迭代器,C#已经给出了2个接口,一个是IEumerator还有一个是IEnumerable。来看看List...原创 2020-02-24 18:26:23 · 299 阅读 · 1 评论 -
解释器模式
前言在游戏中需要生成json的存档文件时(比如游戏中音效大小的存储),就可以使用解释器模式来生成此文件,解释器就相当于翻译员,接下来实现对象和Json相互的功能。1.实现Json解释器对象转换json格式的字符串,需要知道json格式的字符串到底何样,经过查阅资料,感觉介绍的细腻和清晰的就是一下网站:https://www.cnblogs.com/abella/p/11125...原创 2020-02-24 00:09:02 · 176 阅读 · 0 评论 -
命令模式
前言命令模式可以实现操作的前进和回滚,比如经常使用Photoshop的用户就知道它就可以对操作前进和回滚,主要是记录每一个操作节点来实现的。1.实现操作节点模块其实挺多关于设计方面的软件都需要有后退和前进的功能,要实现这个功能就需要把每一个动作都存下来,这个时候命令模式就出现了,将对软件每一个操作都可封装成对象然后保存到列表里,就可以实现动作的可控,就像幻灯片可以步步前进或者后退...原创 2020-02-22 23:54:00 · 248 阅读 · 0 评论 -
责任链模式
前言不知道各位大家有没有看过我写的过滤器模式,这篇文章主要是用责任链模式去重构之前文章中组合过滤器实现的方式,来讲解责任链模式的优点。1.之前过滤器的缺点建议没有看过我之前实现如何组合过滤器的人去看一下,主要去关注一下ToMergeFilter函数是如何实现的,传送门链接:https://blog.csdn.net/m0_37920739/article/details/10...原创 2020-02-21 03:05:58 · 224 阅读 · 0 评论 -
代理模式
前言代理模式主要是用来对目标对象访问权限的控制,比如游戏商城里购买道具时,通过代理类去判断玩家是否可以执行购买操作,然后比较与装饰器的区别。1.静态代理模式详解代理模式根本不管持有的目标对象原方法做了什么,它只关心用户是否有权限访问目标对象的方法,代理类相当于一个安全层,如果在目标对象添加安全判断,这样的话代码就比较耦合,而且权限和安全逻辑的代码本来就不和目标对象的功能根本没有任...原创 2020-02-20 23:53:05 · 186 阅读 · 0 评论 -
享元模式
前言看到享元设计模式,想到了在工作时写的地图编辑器优化方式就可以使用此模式,享元模式主要减少创建对象的数量,以减少内存占用,简直优化游戏内存利器啊。1. 一般地图渲染方式一般2D地图都是使用二维数组去表示的,数组里面存着结构体,结构体里的字段可能碰撞信息,图片信息等等,一般地图资源的情况,我们用代码模拟一下即可,具体代码如下: public enum Collision...原创 2020-02-20 01:04:09 · 361 阅读 · 0 评论 -
外观模式
前言外观模式就相当于一个接待员,比如去餐厅吃饭时,服务员首先会给你菜单让你点菜,给你端茶递菜,然后清理桌子。这些都是服务员去做的,我们只需要享受他们提供的服务即可,不用亲自上阵。1.外观模式详解手游启动的时候,会有一大堆准备动作,首先会检查资源和代码是否需要热更新,步骤二如果需要热更新就远程获取新的资源与本地的资源进行替换,步骤三初始化游戏各个模块的管理器和接入游戏的SDK,步骤...原创 2020-02-19 23:05:06 · 202 阅读 · 0 评论 -
装饰器模式
前言装饰器模式可以让我们实现动态地给一个对象添加一些额外的职责,增加新的功能。然后思考一下和对象适配器的模式到底存在那些区别。1.装饰器的使用在蜘蛛侠的电影中,我们可以看到主角本来是一个普通人,当时被蜘蛛咬了以后,再加上他自己设计的道具,经过一番的装饰主角就变成了蜘蛛侠,我们可以用代码来模拟一下这个事情,首先定义普通人类,具体代码如下:namespace AdapterPat...原创 2020-02-19 18:53:50 · 159 阅读 · 0 评论 -
组合模式
前言组合模式称为整体部分模式,主要是表现对象层次具备整体和部分,呈树形结构,且要求具备统一行为。1.架构引擎时的组合模式架构游戏引擎是离不开组合模式的,这里以Unity为例子,用组合模式简单表达一下如何架构出游戏引擎,首先我们定义出抽象组件类,组件类里应该有位置和锚点等等,具体代码如下: public static class Global { ...原创 2020-02-19 17:19:15 · 161 阅读 · 0 评论 -
过滤器模式
前言过滤器模式是对数据1.过滤器模式实现首先我们先构造出需要过滤的数据,具体带如下:List<Fruit> Fruits = new List<Fruit>();Fruits.Add(new Fruit("Robert", fruitType.High, "Single"));Fruits.Add(new Fruit("John", fruitT...原创 2020-02-18 22:22:35 · 242 阅读 · 0 评论 -
桥接模式
前言这篇文章介绍Untiy中一套动作通用多个模型原理和画图软件一些模块原理。桥接模式就这样登场了。1.Unity引擎中的桥接模式我们先看一下Unity中的一套动作通用多个模型原理,用过的大佬知道使用这个功能是有限制的,首先需要把模型改成Humanoid ,然后还要配置模型的手,脚,头等等的位置,才可以使用动作,具体的设置过程如图下:显示为绿色以后,说明节点配置成功。然后...原创 2020-02-18 13:04:01 · 184 阅读 · 0 评论 -
适配器模式
前言适配器模式从实现方式上分为三种,类适配器和对象适配器还有缺省适配器。它们区别在于实现方式和实际使用场景不同。1.各种适配器详解类适配器)在蜘蛛侠的电影里,我们知道蜘蛛侠的攻击和移动方式和普通人都是不一样的,但是蜘蛛侠被一个小蜘蛛(适配器转换)咬了以后,他就变的与众不同了,所以我们先定义出普通人的类,再使用适配器变身出一个蜘蛛侠来,具体代码如下:using Syst...原创 2020-02-17 16:58:40 · 166 阅读 · 0 评论 -
原型模式
1.using System;namespace PrototypePattern{ public abstract class BasePrototype { public abstract BasePrototype clone(); } public class Test: BasePrototype { ...原创 2020-02-16 22:17:49 · 199 阅读 · 0 评论 -
建造模式
前言最近在写一个功能考虑到不同配置去自动调整渲染,以适应不同机型或者是让用户自己去选择高,中,低的渲染。然后考虑到使用工厂模式还是去建造模式去实现这个功能,所以这里记录一下它们的区别。1.构建游戏渲染对象房屋建造的抽象类,具体代码如下:using System;using System.Collections.Generic;using System.Text;na...原创 2020-02-15 17:42:36 · 242 阅读 · 0 评论 -
工厂模式(简单,配置文件,反射,工厂方法,抽象)
1.简单工厂模式namespace DesignMode{ public class SimpleFactory { public static TrafficInterface CreateInstance(TrafficType type) { switch (type) { case Traf...原创 2018-07-10 19:57:34 · 2427 阅读 · 0 评论 -
单例模式
单例模式现在有二种,第一个是饿汉模式,第二个是懒汉模式。笔者将去实现这2个例子,然后分析它们的优缺点。1.饿汉模式using System;namespace DesignMode{ class SingletonMode { public static SingletonMode instance { get; private set; } = null; ...原创 2018-06-30 21:37:40 · 2801 阅读 · 0 评论