自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 UniRx(1)——简介

目录前言响应式编程可观察序列前言UniRx,顾名思义就是Unity上的ReactiveX(Rx)。Unity就很好理解了,可是这个Rx又是哪路神仙?找到Rx的官方简介,大概意思是:ReactiveX是一个通过可观察序列来综合异步编程和事件编程的库。这句话回答了很多问题:首先它是一个库,其次它的作用是简化异步编程和事件编程,使用的手段是可观察序列。于是,我们现在已经对Rx有了一个比较模糊的认...

2020-03-30 11:50:15 1512

翻译 EventSystem(2)——消息系统&输入模块

MessagingSystem&InputModule新的UI系统使用MessagingSystem(消息系统)来取代SendMessage方法,它是纯C#的,并且以解决SendMessage方法出现的一些问题为目标。消息系统使用一系列自定义接口来工作,你的脚本可以实现这些接口来获得从消息系统接收回调的功能。当特定事件发生时,消息系统确认一个目标游戏对象,并在挂在目标上的所有实现了特定接...

2020-03-29 15:26:18 284

翻译 EventSystem(1)——概述

EventSystemEventSystem(事件系统)提供了一种通过输入设备向对象发送消息的途径,这些输入设备可以是鼠标、键盘、手柄等任意设备。事件系统由一系列相关的组件构成,这些组件相互协作,完成消息的发送。当你向GameObject(游戏对象)添加一个事件系统组件时,你会发现它并没有暴露什么东西。这是因为事件系统本身只是一个管理器,负责各个事件系统模块之间的交互。事件系统的主要功能有:...

2020-03-29 12:14:08 588

原创 (23)行为型模式——访问者

行为型模式——访问者(Visitor)目录行为型模式——访问者(Visitor)问题背景解决方案效果缺陷相关模式实现问题背景当希望在不改变类的前提下增加新的操作时,考虑使用访问者。假设我们自己实现了一个线性表和一个链表,它们已经有了基本的增删改查操作。现在我们想加入排序功能和映射功能(将表中的每个元素x变为f(x)),但又不想直接改原有的类。解决方案为了不修改原有的类,我们只能把新功能加...

2020-02-24 00:15:15 179

原创 用C#实现一个Json解析器(6)——自定义键名映射

目录前言KeyAttribute特性高级语法分析器类改动前言本次我们实现自定义键名映射功能,用户可以指定C#对象的属性和哪个Json键值对构成映射。注意:示例代码使用了C#8.0的语法特性,如果要在你的机器上运行,请确保安装了.Net Core 3.x开发环境。KeyAttribute特性首先创建一个用于提示键名映射的特性:[AttributeUsage(AttributeTarget...

2020-02-22 23:53:21 743

原创 (22)行为型模式——模板方法

行为型模式——模板方法(Template Method)目录行为型模式——模板方法(Template Method)问题背景解决方案效果缺陷相关模式实现问题背景当一些算法都遵循同一套流程,只有部分细节不同时,考虑使用模板方法。现在有一套窗口,它们在关闭时都执行这样一系列操作:重置窗口状态,播放关闭动画,将窗口设为disabled状态(不工作,但仍然在内存中)。在这三个步骤中,重置窗口状态是一...

2020-02-21 21:15:58 120

原创 用C#实现一个Json解析器(5)——语法分析器

目录前言语法分析器接口基本语法分析器类泛型方法带Type参数的方法dynamic方法前言本次我们实现解析器的语法分析功能。注意:示例代码使用了C#8.0的语法特性,如果要在你的机器上运行,请确保安装了.Net Core 3.x开发环境。语法分析器接口因为我们要通过多态来实现两种语法分析器的分离,所以提取一个语法分析器接口IParser:interface IParser{ T...

2020-02-20 20:21:00 1001

原创 (21)行为型模式——策略

行为型模式——策略(Strategy)目录行为型模式——策略(Strategy)问题背景解决方案效果缺陷相关模式实现问题背景当需要从一系列算法中动态选择一个时,考虑使用策略。在大部分有伤害系统的游戏中,都会区分物理伤害和魔法伤害。思考如下场景:单位A攻击单位B,发出抛射体P,P与B碰撞后调用MakeDamage方法造成伤害。这个方法的实现方式就是讨论的重点:是直接在方法内部实现伤害计算逻辑,...

2020-02-19 10:45:06 1354

原创 用C#实现一个Json解析器(4)——词法分析器

目录前言单词类和词性类前言本次我们实现解析器的词法分析功能。单词类和词性类词法分析器输出的是单词流,所以先要有单词类。这里有三点需要声明:单词这种轻量级对象,直接将其声明成结构体能让它们在内存中连续分布,并且不用消耗额外空间生成引用变量。我们不需要修改单词变量,因此直接声明为只读结构。属性的本质是方法,需要切换上下文。为了提高性能,我们直接使用公有字段。internal rea...

2020-02-18 21:36:10 613

原创 (20)行为型模式——状态

行为型模式——状态(State)目录行为型模式——状态(State)问题背景解决方案效果缺陷相关模式实现问题背景当希望对象的行为会随着状态改变而改变时,考虑使用状态。想想LoL,玩家可以让他们操控的英雄移动、攻击、使用技能等,而英雄在一局游戏里会有很多种状态,比如正常、眩晕、沉默、死亡…英雄在不同状态下对不同指令的响应方式可能会有不同。正常状态下英雄会响应任何指令,而眩晕状态下则只响应特定的...

2020-02-17 10:54:28 341

原创 用C#实现一个Json解析器(3)——详细设计②

目录前言加入公有成员前言上回我们已经得到了简单类图,这次就来细品一下每个类应该长什么样,需不需要再增加辅助类。加入公有成员首先来给每个类加入成员:Lexer:词法分析器的任务是把Json字符串转换成单词流,只有一个方法Analyze。Token:单词显然是一个值对象,只有Value和TokenType两个只读属性。考虑到值类型的效率比引用类型高,把Token设计成结构体会更好。Pa...

2020-02-16 10:40:20 369

原创 (19)行为型模式——观察者

行为型模式——观察者(Observer)目录行为型模式——观察者(Observer)问题背景解决方案效果缺陷相关模式实现问题背景当需要一种一对多的通知机制时,考虑使用观察者。在一些游戏中,策划出于某种目的会把玩家的属性划分成一级属性(力量、智力、体质等)和二级属性(生命、魔法、攻击力、防御力等)。在其他因素(装备、修炼、BUFF等)不变的条件下,二级属性是一级属性的函数。因此,在一级属性发生...

2020-02-16 01:03:34 283

原创 用C#实现一个Json解析器(2)——详细设计①

目录前言类提取必要的类扩展UML类图第一阶段成果前言上回我们列出了解析器的全部功能并逐条进行了分析。这次我们以上次的分析结果作为依据设计出整个系统的框架。类提取类和对象是OO系统的一等公民。我们在设计OO系统时,肯定要先做类提取。下面就分几步进行这个过程,最后设计出系统的完整类图。必要的类Lexer(词法分析器):将Json字符串转换成C#对象,本质是一个翻译的过程。首先,需要整个J...

2020-02-14 13:23:21 332

原创 (18)行为型模式——备忘录

行为型模式——备忘录(Memento)目录行为型模式——备忘录(Memento)问题背景解决方案效果缺陷相关模式实现问题背景当需要在不破坏封装性的前提下将对象的状态储存在外部对象中时,考虑使用备忘录。现在有一个可视化的界面编辑工具,用户能直接拖动预览窗口中的控件来改变控件的位置。如果用户对一次操作不满意,他应该可以撤销本次操作,即让编辑器的状态回滚到这次操作之前。解决方案为了实现撤销操作...

2020-02-13 11:04:02 232

原创 用C#实现一个Json解析器(1)——功能清单

目录前言功能清单基本功能附加功能需求细化前言Json是一种轻量级的数据交换格式,语法非常简单,同时能满足大部分需求。支持常见的几种数据类型,支持嵌套。因其体量轻、可以直接和前端JS交互的特点,常被用于前后端的数据传输。此外,由于轻便易解析,Json还在许多软件中代替XML、INI等格式作为配置文件使用。下面我们用C#实现一个简单的Json解析器,在支持基本的对象和Json字符串映射功能的同时...

2020-02-12 22:15:04 460

原创 (17)行为型模式——中介

行为型模式——中介(Mediator)目录行为型模式——中介(Mediator)问题背景解决方案效果缺陷相关模式问题背景当需要降低多个子系统之间的耦合度时,考虑使用中介。在模块化开发中,多个模块(子系统)需要相互协作完成任务。因此,我们虽然强调要尽量降低模块间的耦合度,但完全没有耦合的系统也是毫无意义的。假设有N个子系统,它们两两之间都需要进行通信。在不作任何设计的情况下,整个系统的复杂度是...

2020-02-11 13:44:20 170

原创 (16)行为型模式——迭代器

行为型模式——迭代器(Iterator)目录行为型模式——迭代器(Iterator)问题背景解决方案效果缺陷相关模式实现问题背景当需要重复使用某种规则遍历一个集合时,考虑使用迭代器。现有一整数集合,要求实现三个函数:将其中所有负数打印出来。将其中所有7的倍数打印出来。将其中所有2的幂打印出来。要实现这些功能,必须遍历这个集合。针对这个集合的类型不同,我们会使用不同的遍历规则。如果...

2020-02-10 11:20:04 162

原创 (15)行为型模式——解释器

行为型模式——解释器(Interpreter)目录行为型模式——解释器(Interpreter)问题背景解决方案效果缺陷相关模式实现问题背景当需要为某一类问题创建文法并解释执行时,考虑使用解释器。比如要实现一个计算器,根据用户输入的表达式字符串输出表达式的值。在第一个版本中,计算器只实现了四则运算的功能,并且不能使用“(”和“)”,但是在以后的版本中会不断支持新的运算符。解决方案根据以往...

2020-02-09 14:08:50 185

原创 (14)行为型模式——命令

行为型模式——命令(Command)目录行为型模式——命令(Command)问题背景解决方案效果相关模式实现问题背景当遇到以下需求时,考虑使用命令:将用户和实际执行请求的对象解耦。支持撤销操作。多种操作对应同一种请求。一个请求执行一串连续操作。命令的应用场景非常广泛,一个不得不提的就是菜单功能。考虑一个菜单,首先,用户只需要在菜单上做同样的操作(选择一个选项)就可以实现各种截然...

2020-02-08 12:57:01 294

原创 (13)行为型模式——责任链

结构型模式——责任链(Chain of Responsibility)目录结构型模式——责任链(Chain of Responsibility)问题背景解决方案效果缺陷相关模式实现问题背景当希望让多个对象都有处理请求的机会时,考虑使用责任链。责任链的应用场景比较有限,这里就直接照搬书中的案例了。考虑一个图形用户界面中的上下文有关的帮助机制:用户在不同的界面点击帮助按钮,会显示不同的帮助文档。...

2020-02-07 10:44:34 153

原创 (12)结构型模式——代理

结构型模式——代理(Proxy)目录结构型模式——代理(Proxy)问题背景解决方案效果缺陷相关模式实现问题背景当需要监控外界对对象的访问时,考虑使用代理。举个大家都干过的例子哈,在咱这一代小时候,互联网这东西还没这么牛X。你要约女朋友出来,却没有QQ微信电话,只能硬着头皮去她家找。然而开门的不是你女朋友,而是你老丈母娘。老丈母娘问你,叫她宝贝女儿出去干嘛。这时候,要是你说:我们约好要一起写...

2020-02-06 10:56:31 190

原创 (11)结构型模式——享元

结构型模式——享元(Flyweight)目录结构型模式——享元(Flyweight)问题背景解决方案效果缺陷相关模式实现问题背景当使用大量细粒度对象,需要提高系统性能时,考虑使用享元。现在我们要为一个RPG游戏设计装备系统,首先根据需求提取出装备类的属性,可能包括:标识符、名称、描述、装备类型、初始属性取值集合、穿戴条件、属性集合、耐久上限、当前耐久、最高强化等级、强化等级……我们会发现这些...

2020-02-05 20:43:07 232

原创 (10)结构型模式——门面

结构型模式——门面(Facade)目录结构型模式——门面(Facade)问题背景解决方案效果相关模式问题背景当需要为一个复杂的系统提供简单的接口时,考虑使用门面。现有一个编译器,由Lexer,Parser,Token等类组成,内部结构比较复杂。但编译器完成的唯一功能就是编译源代码,用户大多数情况下也不需要定制功能。解决方案提供一个高层接口,这个接口包含系统的基本功能;系统内部的类同样会暴...

2020-02-05 18:45:04 191

原创 (9)结构型模式——装饰器

结构型模式——装饰器(Decorator)目录结构型模式——装饰器(Decorator)问题背景解决方案效果缺陷相关模式实现问题背景当需要动态地扩展一个对象时,可以考虑使用装饰器。用RPG游戏中烂大街的宝石镶嵌功能举例:现有一个装备类,在设计之初并没有考虑镶嵌功能,如果要在类内部加入镶嵌逻辑,就必须修改原有代码。而修改原有代码很容易引起回归错误,尤其是进行这种大规模改动的时候。解决方案由...

2020-02-05 11:42:16 230

原创 (8)结构型模式——复合

结构型模式——复合(Composite)目录结构型模式——复合(Composite)问题背景解决方案效果缺陷相关模式实现问题背景当希望用某种统一的方式表示一个树形结构,并屏蔽内部实现,提供统一接口时,考虑使用复合模式(也叫组合模式)。复合模式的典型应用场景就是界面,界面包括文字、按钮等基本控件,还解决方案效果缺陷相关模式实现...

2020-02-04 15:02:37 284

原创 (7)结构型模式——桥接

结构型模式——桥接(Bridge)目录结构型模式——桥接(Bridge)问题背景解决方案效果缺陷相关模式实现问题背景当对象有两个可能的扩展维度时,应该考虑使用桥接。现在我们对动物进行建模,将它们从两个维度分为陆生生物和海洋生物、植食动物和肉食动物。根据语义,这四种动物和动物这个抽象概念之间均为is-a的关系,因此我们直接提取一个动物接口IAnimal,并让四个实现类都直接实现IAnimal。...

2020-02-04 10:19:23 267

原创 (6)结构型模式——适配器

结构型模式——适配器(Adapter)目录结构型模式——适配器(Adapter)问题背景解决方案效果缺陷相关模式实现问题背景当需要将一个接口转换成另一个具有相同参数列表和返回值的接口时,使用适配器。适配器的使用场景一般是移植类库,旧版本类库的接口与新版本的不兼容,因此需要使用适配器来转换接口。假设现有一个排序算法库,通过ISort接口中的Sort方法运行,要将这个库移植到另一个库中,新库的接...

2020-02-03 14:41:30 284 1

原创 (5)创建型模式——单例

创建型模式——单例(Singleton)目录创建型模式——单例(Singleton)问题背景解决方案效果缺陷相关模式实现问题背景当某个类的实例只需要有一个或只能有一个时,通常有两种做法。一是直接使用静态类,这是一种面向过程的做法,它的优点是实现和使用比较方便,但这种做法无法享受到面向对象机制带来的好处;另一种做法是使用单例类,将构造方法设为私有并在内部保证全局只有一个实例。假设在一局LOL中...

2020-02-03 11:41:53 1349

原创 (4)创建型模式——原型

创建型模式——原型(Prototype)目录创建型模式——原型(Prototype)问题背景解决方案效果缺陷相关模式实现问题背景当希望批量生成有状态对象时,应该考虑使用原型模式。假设有一种怪物,它有生命值、魔法值、攻击力、防御力等大量属性,可以一次分裂出十个与自己完全相同的怪物。如果直接实现这个逻辑,代码会是这样的:var monster = new Monster();monster....

2020-02-02 13:54:52 240

原创 (3)创建型模式——工厂方法

创建型型模式——工厂方法(Factory Method)目录创建型型模式——工厂方法(Factory Method)问题背景解决方案效果缺陷相关模式实现问题背景为了引出问题,我们首先介绍一种未被纳入GoF设计模式的模式:简单工厂。这个模式是为了将某个接口的某个实现的创建和表示分离而存在的。听起来似乎有点晦涩,下面举个例子。在LOL的载入过程中,游戏要根据玩家在房间的选择来创建对应的英雄。由于...

2020-02-02 13:01:07 262

原创 (2)创建型模式——生成器

创建型模式——生成器(Builder)目录创建型模式——生成器(Builder)问题背景解决方案效果缺陷相关模式实现问题背景当创建一个可以明显划分为多个可配置部件的复杂对象时,可以考虑使用生成器。比如我们现在要创建一台电脑,电脑有处理器、显卡和硬盘三个可配置部件。创建一台高配电脑和一台低配电脑,如果不使用生成器,代码是这样的:var high = new Computer();high....

2020-02-01 19:45:23 254

原创 (1)创建型模式——抽象工厂

抽象工厂目录抽象工厂问题背景解决方案效果缺陷实现问题背景当希望能够替换和扩展一族相关类的实现来给予程序定制性时,可以使用抽象工厂。最常见的需求就是界面换肤:用户可以自由选择Windows或Mac风格的界面,并且在以后的版本迭代中可能推出更多款式。在这种需求下,如果把客户端实现成这样就会造成很多麻烦:这是典型的“非OO”做法,在OOP中,要实现对象行为的动态切换,应该使用多态,而不是将各种...

2020-02-01 08:43:53 337

原创 (0)引言

目录前言设计模式是什么为什么需要设计模式如何学好设计模式关于本专栏前言面向对象设计模式(以下简称设计模式)是一个老生常谈的话题了,它是程序员的必修课,被称为“程序员的内功心法”,可见其是多么重要。提起设计模式,我这里就不得不多说几句废话。我第一次接触到“设计模式”这个词是在大一的“面向对象程序设计”课上,依稀记得当时老师只讲了“单例模式”和“策略模式”等几个常见的模式。虽然没多少东西,却把我...

2020-02-01 00:01:21 270

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除