Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts in 2021.1


C#设计模式之访问模式

Visitor 是面向对象设计模式中一个很重要的设计模式,这个模式是一种将数据操作和数据结构分离的一种方法,它能够在不修改结构的情况下向现有对象结构添加新操作,是遵循开放/封闭原则的一种方法。上述这个定义很枯燥抽象,那就以例子来说明吧。     假设我们要打印四则运算表达式,比如(1.0+(2.0+3))的字符串表示,或者对其求值,这是两个需求,一个是打印,一个是求值。为了简化,这里仅对加号括号进行处理,其他的可以类推。在写任何代码之前,一定要考虑一下是否面向对象,针对上面的字符串,可以将数字和操作符抽象为两个对象,并实现同一抽象类Expression。 public abstract class Expression { }     目前上述Expression抽象类没有任何成员或方法,后续我们会添加。接着添加表示doule类型数字的具体类DoubleValueExpression,和 …

Design Pattern Visitor Pattern Double Dispatch

C#设计模式之状态模式

状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。状态模式与有限状态机的概念紧密相关。其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。 不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则被称为转移。      其实在之前的文章熔断器设计模式中,就是状态模式的很典型应用,系统有三种状态,闭合状态,此时系统能正常运行,当发生错误,且错误次数达到阈值时,会进入到断开状态,当断开状态持续一定时间,系统会进入到半闭合状态,此时能运行请求处理,当请求处理成功,成功次数达到阈值,则进入闭合状态,否则如果仍然失败,则会退回断开状态,系统不处理请求,直接返回错误,在那篇文章里,有详细代码演 …

Design Pattern State Pattern

C#设计模式之备忘录模式

在之前的命令模式中,我们可以保存所有的对系统的状态修改的命令,通过按顺序执行命令的方式,使得系统能够回滚到之前的任何一个时点,这种回滚是累积式的。     但是在某些情况下,我们并不关心这种“回放”,我们只关心如何将系统回滚到特定的某一个状态即可。备忘录模式非常像快照,我们给系统在某一时刻进行拍照,保存其所以需要的状态,从而在后续某个需要的时间点可以进行恢复。 ▲ 图片来自 https://refactoring.guru/design-patterns/memento     以前面在讨论命令模式的银行账户的例子来看,我们需要保存的状态为银行账户的余额,所以需要将资金字段balance保存起来,但是这里有个问题,资金应该是银行账户BankAccount的内部字段,不应该提供给外部直接访问,因为这样会破坏封装性,但是要保存快照就必须要能访问到这个私有字段。一个解决方法是,使用内部类来实现 …

Design Pattern Memento Pattern

C#设计模式之策略模式

策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。这么说还有点抽象,这里就举个例子。假设我们需要输出一个字符串列表,比如以如下列表方式输出: just like this     随着需求的变更,可能需要输出不同的格式,比如增加一些特殊符号,比如如果要输出列表,则需要在用"<ul>"或者"<li>"来对字符串进行包装,再比如在HTML或者JSON格式中,需要输出一些起始标签或者结束标签。     所以我们可以抽象出一种输出列表格式的策略: 渲染开始标签或者元素 渲染列表中的每一个对象 渲染结束标签或者元素     不同的策略,可能有不同的格式,但是流程是通用的。     根据策略能否在运行时动态替换,策略模式有两种形式,分别是动态策略和静态策略模式。 动态策略模式     我们的目标是以两种格式输出列表: …

Design Pattern Strategy Pattern