<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>yycoding-记录编程点滴</title><description>.NET Developer,前微软最有价值专家(2012-2016)</description><link>https://www.yycoding.xyz/</link><pubDate>Tue, 28 Apr 2026 07:52:06 GMT</pubDate><copyright> ©2011-2026 yycoding.xyz</copyright><generator>Moonglade v12.9.1</generator><language>en-US</language><item><title>订单簿重建引擎的架构演进与性能优化</title><link>https://www.yycoding.xyz/post/2026/1/26/architectural-evolution-and-performance-optimization-of-the-orderbook-reconstruction-engine</link><description>在构建低延迟交易系统时，全速盘口（OrderBook）的实时重建是数据处理链路中计算密度最高、对延迟最敏感的环节之一。本文将详细阐述 FastMarketDataManager 组件的演进历程，分析从单线程模型到静态分片，再到基于消息队列的动态负载均衡架构的技术决策过程，重点介绍如何在保证数据严格时序的前提下，摒弃了传统的加锁同步方案，转而利用消息队列的 FIFO 特性，设计了基于控制指令（Command Pattern）的异步迁移流程，解决热点股票引发的队头阻塞（Head-of-Line Blocking）问题。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><category>Design Patterns</category><guid isPermaLink="false">11327188-83EC-42CC-A01D-764B3C8C5522</guid><pubDate>Mon, 26 Jan 2026 00:13:51 GMT</pubDate></item><item><title>实现一个简单的基于语义的C#代码比较工具</title><link>https://www.yycoding.xyz/post/2025/12/1/implement-a-simple-semantic-comparison-tool-for-csharp-base-on-roslyn</link><description>代码比较功能在很多版本管理工具中都存在，比如Git和TortoiseSVN，Compare Beyond中也有。这个功能可以很方便的帮助我们查看代码的变更。目前这些工具都是简单的基于文本差异的比较。然而在有些时候，我们需要基于语义的比较，比如在代码中，我只是调整了方法的前后顺序、添加了一些注释、删除了一些语句之间的空格，或是将一个大的类使用partial关键字，拆分到多个源文件中。在这种情况下，传统的基于简单文本进行代码比较的方式则失去了应有的作用。我们需要保证代码的逻辑和正确定不变即可，而不关心代码的书写格式，比如行号，空格，注释，格式化这些。本文基于Roslyn实现了一个简单的基于语义的C#代码比较工具。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">77D495EE-A344-40ED-B03A-18BAD8E7AB04</guid><pubDate>Sun, 30 Nov 2025 23:43:55 GMT</pubDate></item><item><title>C# 进程间通信深度解析：命名管道、TCP/IP 与内存映射文件</title><link>https://www.yycoding.xyz/post/2025/8/5/in-depth-analysis-of-inter-process-communication-in-csharp-named-pipes-tcp-ip-and-memory-mapped-files</link><description>在现代软件架构中，无论是模块化的单体应用、面向服务的架构（SOA），还是日益普及的微服务部署，进程间通信（Inter-Process Communication, IPC）都已从一个简单的实现细节，演变为影响系统性能、安全性与可维护性的基石性架构决策。在此背景下，选择一种合适的 IPC 机制，不仅关乎数据传输的效率，更直接决定了整个系统的响应能力、资源消耗和技术债务。本文介绍了Windows平台上三种主流的IPC通讯方式：命名管道（Named Pipes），   TCP/IP 套接字（TCP/IP Sockets），和内存映射文件（Memory-Mapped Files, MMF），给出了在一对一通讯场景下的企业级实现，并基于BenchmarkDotNet，使用乒乓测试的方式测试了三者的性能，结果显示，在本机IPC模式下，小字节的数据（16B，256B）传输下，内存映射文件的传输效率具有绝 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">D7FD1AD0-99E5-4F1B-ACE0-328B055CDEB6</guid><pubDate>Mon, 04 Aug 2025 17:08:20 GMT</pubDate></item><item><title>C++语言演化中的审慎原则</title><link>https://www.yycoding.xyz/post/2025/7/3/the-principle-of-prudence-in-the-evolution-of-cplus-plus</link><description>本文深入剖析了C++语言演化中所秉持的“审慎原则”，论证了标准委员会（WG21）通过有意识地拒绝或搁置某些语言特性，从而成功维护了C++的长期稳定性与核心设计哲学。报告通过四个关键案例展开论证：一、在处理多重继承的虚函数名冲突时，委员会选择推广设计模式（适配器模式）而非引入新“重命名”语法，以避免语言膨胀。二、面对双重分发的需求，它采纳了访问者模式，拒绝了可能导致对象模型过度复杂化的原生语言支持。三、它坚定地拒绝内置垃圾回收（GC）机制，以捍G卫RAII范式、零开销原则及性能的确定性，这些是C++的立身之本。四、在类型推导上，它没有直接采纳当时已有但存在瑕疵的typeof，而是精心设计了语义更精确的decltype，彰显了对语言基础工具正确性的极致追求。综上所述，这些决策共同揭示了C++标准化过程中的一种成熟智慧：通过审慎的“减法”来保证语言的健壮、高效与持久生命力 …</description><author>xjdx2008@126.com</author><category>C++</category><category>Design Patterns</category><guid isPermaLink="false">50688FF9-93C7-468D-96DA-38271D0A271A</guid><pubDate>Wed, 02 Jul 2025 16:21:34 GMT</pubDate></item><item><title>不止于值：解析.NET中“赋值即触发”的状态驱动事件模式</title><link>https://www.yycoding.xyz/post/2025/6/19/more-than-just-a-value-analyzing-the-assignment-as-trigger-state-driven-event-pattern-in-dotnet</link><description>即便是给一个对象的属性赋上与它当前完全相同的值，相关的“已更改”（XXXChanged）事件依然被触发了。一个典型的例子就是在使用 System.Data.DataTable 或System.Configuration.ApplicationSettingsBase时。研究源码发现，ApplicationSettingsBase 和 DataTable 的“赋值即触发”行为，并非缺陷，而是.NET框架中一个优雅且实用的状态驱动事件模式的体现。它将数据容器从简单的值存储器提升为强大的状态机，极大地简化了数据持久化和同步的复杂性。它选择牺牲微不足道的判断性能，来换取核心功能（状态跟踪）的绝对可靠性。理解了其“关注状态，而非价值”的核心思想，并洞悉其源码实现后，我们就能根据实际场景，明智地选择是利用还是“修正”这一行为，从而编写出更健壮、更高效的.NET应用程序。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">5CD05F4F-B3FA-4EA9-BB35-45305EAC1A80</guid><pubDate>Thu, 19 Jun 2025 00:25:31 GMT</pubDate></item><item><title>使用可变参数模板和CRTP实现访问者模式</title><link>https://www.yycoding.xyz/post/2024/7/13/refractor-the-visitor-pattern-implementing-using-cpp-variadic-templates-and-crtp</link><description>Visitor模式的一大缺点就是依赖问题，在定义Visitor接口的时候，就必须要知道所有的子类类型。在一些编译链接型语言如C++中，Visitor类和子类就会出现相互依赖的情况，当然，通过前向声明可以解决这个问题。另外一个问题就是在不同的子类中有很多“制式”代码。比如所有的子类必须实现基类中的Accept(Visitor&amp;)方法，并且方法的实现都是一模一样的，都是调用该参数的Visitor方法并传入指向对象本身的引用。幸好在C++ 11中引入了可变参数模板，使用可变参数模板以及CRTP技术，可以极大简化Visitor模式中的一些实现方面的问题。在这一过程中顺便学习和了解Moden C++的一些强大的功能，这些功能是如此的特别以至于它跟C#有很大的不同。 …</description><author>xjdx2008@126.com</author><category>C++</category><category>Design Patterns</category><guid isPermaLink="false">DC284C23-5EDC-420A-9F57-C7B13183DEB0</guid><pubDate>Fri, 12 Jul 2024 18:58:40 GMT</pubDate></item><item><title>C++中的可变参数模板</title><link>https://www.yycoding.xyz/post/2024/7/8/variadic-templates-in-cplusplus</link><description>本来是想接着上文继续来说明如何使用C++模板来简化Visitor设计模式的，但这里涉及到了C++ 11中引入的可变参数模板，这个特性很有用，所以值得专门写一篇文章来介绍一下C++中的可变参数模板。可变参数模版比较特殊，跟其它语言比如C#里面的params相比，似乎更加灵活和强大。

当然我没有能力对某个特性做全面的解读，可变参数模板有很多用处，这里列举了侯捷老师在《 C++新标准：C++11&amp;14》课程里对可变参数模版的解读里面举的几个例子，这几个例子比较经典，完美的解释了可变参数模版的用法。这篇文章算是一个简单的笔记，C++里面有些特性需要反复的学习和复习才能掌握。 …</description><author>xjdx2008@126.com</author><category>C++</category><category>Design Patterns</category><guid isPermaLink="false">D056F3D0-5362-4732-9C41-CBC0F627EAF1</guid><pubDate>Sun, 07 Jul 2024 16:21:26 GMT</pubDate></item><item><title>从双分发的视角看访问者模式</title><link>https://www.yycoding.xyz/post/2024/6/15/inspect-visitor-pattern-from-double-dispatch-perspective</link><description>在23种经典设计模式中，Visitor模式可能是比较难理解的几个模式之一，之前在C#设计模式之访问模式这篇文章中渐进式的介绍了Visitor设计模式。恰巧最近看的《C++语言设计与演化，简称D&amp;E》这本书中提到了一个单分派和双分派的概念，这里从前文介绍的C++中的虚函数表以及动态分发即单分发的基础上，介绍双分发以及基于双分发的Visitor设计模式，试着从另外一个角度来看访问者这一经典的设计模式，最后对比了通过工厂方法和访问者模式的异同。 …</description><author>xjdx2008@126.com</author><category>C++</category><category>Design Patterns</category><guid isPermaLink="false">D80163F9-ABD8-46C0-8966-3800D1A67D03</guid><pubDate>Sat, 15 Jun 2024 05:26:31 GMT</pubDate></item><item><title>从单元测试来对代码逻辑进行改进</title><link>https://www.yycoding.xyz/post/2021/6/1/refactoring-the-code-from-the-unit-test</link><description>这个例子来源于Pro ASP.NET Core 3这一本书，书中介绍了对ASP.NET Core程序进行单元测试的方法，其中有一例，在对购物车逻辑模块进行功能开发的时候，发现单元测试很“吃力”，后面得到了如何对其进行优化，从而大大简化了单元测试的方法。所以这里记录一下。 购物车的实现     这里只是一个简单的购物车实现，用户在挑选物品放进购物车的时候，将数据临时存放在了Session中（缺点是如果服务器重启，数据会丢失，这里不讨论）。购物车的模型Cart如下： public class Cart {     public List&lt;CartLine&gt; Lines { get; set; } = new List&lt;CartLine&gt;();     public virtual void AddItem(Product product, int quantity)     { …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">1A2C3088-5EC3-4373-8F5B-8161A1B561B9</guid><pubDate>Mon, 31 May 2021 17:38:17 GMT</pubDate></item><item><title>C#设计模式之观察者模式</title><link>https://www.yycoding.xyz/post/2021/3/8/introduction-to-design-patterns-of-observer-pattern</link><description>观察者模式，简单来说就是一个组件在状态发生变化的时候，可以通知其它组件。观察者模式用途很广，比如在UI界面中，当绑定的数据对象发送改变，UI会跟着发送改变。观察者模式是一种很常见和必要的模式，C#的设计者通过关键字event来简化对观察者模式的使用。它的基本用法是，首先使用event关键字定义事件，然后注册事件回调方法EventHandler，回调方法通常包含两个参数，一个object类型的sender和一个继承自EventArgs的参数，该参数携带一些触发事件的必要信息。     event事件其实是对委托的包装，就像Action和Func是对lamda表达式的包装一样。对event的包装成为EventHandler，有泛型和非泛型版本，泛型主要是继承自EventArgs的类型。     下面举个例子说明：假设人病了需要去看医生。首先要定义看医生时要提供的信息，在这个例子中只需要告诉医生 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">ECE45156-C030-4E68-B7EC-87406046505F</guid><pubDate>Sun, 07 Mar 2021 23:55:55 GMT</pubDate></item><item><title>C#设计模式之中介者模式</title><link>https://www.yycoding.xyz/post/2021/2/28/introduction-to-design-patterns-of-mediator-pattern</link><description>大部分应用程序通常包含多个组件，这些组件之间通常通过直接引用来进行通讯。但是在某些情况下，并不想某个组件知道其他组件的存在，或者即使知道，也不要通过直接引用的方式来进行通讯或交互，因为这种直接引用的方式就会产生依赖，从而会扩展对象的生命周期，除非通过弱引用的方式来进行。     中介者模式是一种遍历多个组件之间通讯或交互的模式。他用一个中介对象封装一系列的对象交互，中介者使各对象不需要显示地相互作用，从而使耦合松散，而且可以独立地改变它们之间的交互。      使用中介模式，对象之间的交互将封装在中介对象中。对象不再直接相互交互（解耦），而是通过中介进行交互。这减少了对象之间的依赖性，从而减少了耦合。     中介者模式的优点就是减少类间的依赖，把原有的一对多的依赖变成了一对一的依赖，同事类只依赖中介者，减少了依赖，当然同时也降低了类间的耦合；缺点就是中介者会膨胀得很大，而且逻辑复杂，原本 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">A559841F-1AC0-49B1-98C2-60B1511656E0</guid><pubDate>Sun, 28 Feb 2021 01:41:42 GMT</pubDate></item><item><title>C#设计模式之访问者模式</title><link>https://www.yycoding.xyz/post/2021/1/22/introduction-to-design-patterns-of-visitor-pattern</link><description>Visitor 是面向对象设计模式中一个很重要的设计模式，这个模式是一种将数据操作和数据结构分离的一种方法，它能够在不修改结构的情况下向现有对象结构添加新操作，是遵循开放/封闭原则的一种方法。上述这个定义很枯燥抽象，那就以例子来说明吧。     假设我们要打印四则运算表达式，比如（1.0+（2.0+3））的字符串表示，或者对其求值，这是两个需求，一个是打印，一个是求值。为了简化，这里仅对加号括号进行处理，其他的可以类推。在写任何代码之前，一定要考虑一下是否面向对象，针对上面的字符串，可以将数字和操作符抽象为两个对象，并实现同一抽象类Expression。 public abstract class Expression {  }     目前上述Expression抽象类没有任何成员或方法，后续我们会添加。接着添加表示doule类型数字的具体类DoubleValueExpression，和 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">65C90F57-9384-40CA-8DE7-FC24B1D0CCC7</guid><pubDate>Fri, 22 Jan 2021 01:28:39 GMT</pubDate></item><item><title>C#设计模式之状态模式</title><link>https://www.yycoding.xyz/post/2021/1/18/introduction-to-design-patterns-of-state-pattern</link><description>状态模式是一种行为设计模式， 让你能在一个对象的内部状态变化时改变其行为， 使其看上去就像改变了自身所属的类一样。状态模式与有限状态机的概念紧密相关。其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中， 程序的行为都不相同， 且可瞬间从一个状态切换到另一个状态。 不过， 根据当前状态， 程序可能会切换到另外一种状态， 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则被称为转移。      其实在之前的文章熔断器设计模式中，就是状态模式的很典型应用，系统有三种状态，闭合状态，此时系统能正常运行，当发生错误，且错误次数达到阈值时，会进入到断开状态，当断开状态持续一定时间，系统会进入到半闭合状态，此时能运行请求处理，当请求处理成功，成功次数达到阈值，则进入闭合状态，否则如果仍然失败，则会退回断开状态，系统不处理请求，直接返回错误，在那篇文章里，有详细代码演 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">F69E9B35-18C2-4ECC-AACA-8B7D4583198E</guid><pubDate>Mon, 18 Jan 2021 00:04:21 GMT</pubDate></item><item><title>C#设计模式之备忘录模式</title><link>https://www.yycoding.xyz/post/2021/1/12/introduction-to-design-patterns-of-memento-pattern</link><description>在之前的命令模式中，我们可以保存所有的对系统的状态修改的命令，通过按顺序执行命令的方式，使得系统能够回滚到之前的任何一个时点，这种回滚是累积式的。     但是在某些情况下，我们并不关心这种“回放”，我们只关心如何将系统回滚到特定的某一个状态即可。备忘录模式非常像快照，我们给系统在某一时刻进行拍照，保存其所以需要的状态，从而在后续某个需要的时间点可以进行恢复。  ▲ 图片来自 https://refactoring.guru/design-patterns/memento     以前面在讨论命令模式的银行账户的例子来看，我们需要保存的状态为银行账户的余额，所以需要将资金字段balance保存起来，但是这里有个问题，资金应该是银行账户BankAccount的内部字段，不应该提供给外部直接访问，因为这样会破坏封装性，但是要保存快照就必须要能访问到这个私有字段。一个解决方法是，使用内部类来实现 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">133E088C-D996-4488-BF81-39ABD696A86A</guid><pubDate>Tue, 12 Jan 2021 00:38:17 GMT</pubDate></item><item><title>C#设计模式之策略模式</title><link>https://www.yycoding.xyz/post/2021/1/8/introduction-to-design-patterns-of-strategy-pattern</link><description>策略模式是一种行为设计模式， 它能让你定义一系列算法， 并将每种算法分别放入独立的类中， 以使算法的对象能够相互替换。这么说还有点抽象，这里就举个例子。假设我们需要输出一个字符串列表，比如以如下列表方式输出： just like this      随着需求的变更，可能需要输出不同的格式，比如增加一些特殊符号，比如如果要输出列表，则需要在用"&lt;ul&gt;"或者"&lt;li&gt;"来对字符串进行包装，再比如在HTML或者JSON格式中，需要输出一些起始标签或者结束标签。     所以我们可以抽象出一种输出列表格式的策略： 渲染开始标签或者元素 渲染列表中的每一个对象 渲染结束标签或者元素      不同的策略，可能有不同的格式，但是流程是通用的。     根据策略能否在运行时动态替换，策略模式有两种形式，分别是动态策略和静态策略模式。 动态策略模式     我们的目标是以两种格式输出列表： …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">45EDA6D8-30E3-44B3-B486-BDE2E9F14A03</guid><pubDate>Fri, 08 Jan 2021 00:30:55 GMT</pubDate></item><item><title>C#设计模式之命令模式</title><link>https://www.yycoding.xyz/post/2020/12/25/introduction-to-design-patterns-of-command-pattern</link><description>命令模式(command)简单来说就是将一系列的请求命令封装成对象，而不是直接调用真正执行者的方法，真正的执行由这个封装好的对象来执行，这样比较好扩展。比如我们在应用里面，经常会用到复制粘贴操作，这个操作可以由主菜单下面的按钮发出，也可以由快捷工具栏的按钮发出，也可以由快捷键Ctrl+C、Ctrl+V产生，这些不同的请求者发出的改变行为是一样的，如果各自都直接进行操作，就会使得代码逻辑重复，并且在执行一些撤销Undo或者重做Redo操作时就比较难以实现。    另外，在一些应用场景下，我们需要记录修改之前的值，以便于事后进行审计，或者回滚到之前的值等等。这种普通的直接对对像进行修改或者执行某种逻辑的方式，就无法扩展我们自定义的逻辑，比如日志、审计等等。 场景     假设我们需要对一个允许透支的银行账户进行建模，这个对象包含了两个方法，存款Deposit和取款Withdraw操作。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">E23936C1-81DF-43C0-B150-C9FE321491CF</guid><pubDate>Thu, 24 Dec 2020 22:55:03 GMT</pubDate></item><item><title>C#设计模式之职责链模式</title><link>https://www.yycoding.xyz/post/2020/12/19/introduction-to-design-patterns-of-chain-of-responsibility-pattern</link><description>在软件开发中，我们通常会遇到一种场景，比如某个请求，会依次经过系统中的很多个模块来处理，如果某个模块处理不了，则将请求传递给下一个模块，比如在订单处理中，首先要经过用户校验，商品库存充足校验，如果不满足条件，返回错误，如果满足条件才会到下一步处理。     在ASP.NET Core里有middleware中间键的概念，每一个请求进来，都会经过一系列的Handler，这是一种职责链模式，每一个Handler都会决定是否处理该请求，以及是否决定将该请求传递给一下请求继续处理。     在.NET的委托中，也有一个委托链概念，当多个对象注册同一事件时，对象将委托放在一个链上，依次处理。     在JavaScript或者WPF的事件模型中，事件有冒泡和下沉，事件能够逐个向上级或者下级对象传递，每个对象都会决定是否会对该事件进行回应，或者终止事件的继续传递。     这些都是典型的职责链模式，责 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">F0EBBBCE-D9AC-46A4-ABD1-44EFBD5886B8</guid><pubDate>Sat, 19 Dec 2020 00:13:40 GMT</pubDate></item><item><title>C#设计模式之适配器模式</title><link>https://www.yycoding.xyz/post/2020/11/30/introduction-to-design-patterns-of-adapter-pattern</link><description>适配器模式，简单来说，就是将一个类的接口转换为另外一个类的接口，使得原本由于接口不兼容而不能一起工作的那些类能够一起工作。在现实生活中，这种例子也很多，比如我们如果买的是港行的电器，比如港版的iPhone，英版的原版树莓派，那么自带的充电器插头可能就是英标，在国内不能直接使用，国标的插头间距跟英标不兼容，所以，就需要一个适配器。
▲ 不同标准插头的适配
    还有个现实生活中的，比如我的车是个低配的绒布座椅，可以换更高级一点车的座椅，但是座椅的宽度可能不一样，那么就需要加一个滑轨适配器，一头把滑轨固定到车子上，一头就可以连接新更宽的座椅。
▲ 不同宽度汽车座椅的兼容安装
    还有个更有意思的图，下面这个😂。
▲ 汽车到铁轨转换器，图片来自 https://refactoring.guru/
场景

    现在来说说软件开发中的一些场景，假设我们有一个基础绘 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">EB745132-004A-44D8-95BA-970C4F6BBE91</guid><pubDate>Mon, 30 Nov 2020 04:49:54 GMT</pubDate></item><item><title>C#设计模式之桥接模式</title><link>https://www.yycoding.xyz/post/2020/10/31/introduction-to-design-patterns-of-bridge-pattern</link><description>    在软件设计中，有一个很常见的问题是&amp;ldquo;状态空间爆炸&amp;rdquo;（state space explosion），即同一个对象的多个不想关的实体，用来表示所有可能的状态时，就会出现笛卡尔乘积式的问题。比如，假如我们有不同颜色的红色、蓝色(状态1)不同形状的(状态2)圆形、矩形对象，就要写四个类，比如RedSquare、BlueSquare、RedCircle、BlueCircle。如果增加一种形状，就要增加2个类，增加一种颜色，也要增加2各类。

    我们要做的其实就是把一个事物的两个方面&amp;ldquo;组合&amp;rdquo;在一起，有多种方法能实现这一点，例如，如果颜色是一个简单特性，我们可以将颜色定义为枚举，如果颜色是可变属性、字段或行为我们就不能把他定义为枚举了。如果硬要这么做，要么代码里会出现很多if..else或者switch，这些分支语句里包含了其他一些不想关 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">5D56F39F-7B16-49C6-ADF7-7DFD83057312</guid><pubDate>Sat, 31 Oct 2020 00:44:56 GMT</pubDate></item><item><title>C#设计模式之享元模式</title><link>https://www.yycoding.xyz/post/2020/10/10/introduction-to-design-patterns-of-flyweight-pattern</link><description>   Flyweight，fly是苍蝇的意思，拳击里有个&amp;ldquo;蝇量级&amp;rdquo;，翻译也是&amp;ldquo;flyweight&amp;rdquo;，在设计模式中，Flyweight被翻译成了&amp;ldquo;享元&amp;rdquo;，意思是&amp;ldquo;共享元素&amp;rdquo;。在一些需要大量小的对象的应用场景，如果想要减少内存占用，可以考虑享元模式。下面举两个例子说明。
Example 1：人名的存储

    比如，在英语国家，有很多人叫&amp;ldquo;John Smith&amp;rdquo;，如果我们在系统里，就要存储这个名字很多次，那么就需要很多额外的内存来存储相同的名字。相反，如果我们能够只存储某个名字一次，然后其余的都引用这个名字，这样就会节省很多空间。
   再比如，可能&amp;ldquo;Smith&amp;rdquo;这个姓有很多人用，那么就可以将名字&amp;ldquo;John&amp;rdquo;和姓&amp; …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">96721561-51B1-47EA-82CF-67C5671A6143</guid><pubDate>Sat, 10 Oct 2020 03:38:46 GMT</pubDate></item></channel></rss>