1.8k 2 分钟

# 访问者模式 属于行为型模式。 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 适用性: 主要目的是将数据结构与数据操作分离。适用于稳定的数据结构,而算法是可以多变的。 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。 访问者模式的缺点是使增加新的数据结构变得困难了。 访问者模式不常用。因为数据结构不变化的情况很少,所以使用访问者模式的机会不多。 # 类图 # 代码 # 访问者 namespace...
1.4k 1 分钟

# 解释器模式 属于行为型模式。 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。 适用性: 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。 当有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。 易扩展,易于实现简单文法。 对于复杂的文法比较难维护和管理。当文法非常复杂时建议使用其他的技术(语法分析程序或编译生成器) # 类图 # 代码 # 解释器 namespace...
1.9k 2 分钟

# 享元模式 属于结构型模式。 运用共享技术有效地支持大量细粒度的对象。 享元模式可以避免大量非常相似类的开销。如果能把那些不同的参数移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度减少单个实例的数目。 在 CSharp 中,string 就是运用了享元模式。例:声明两个字符串 string A = "A"; string B = "A"; 使用 Object.ReferenceEquals (A, B); 检查 A 和 B 是否是相同的实例,结果:true # 类图 # 代码 #...
3.7k 3 分钟

# CSharp 多线程 每一个运行的程序是一个进程,每个进程可以有一个或者多个线程。 在单核系统的一个单位时间内 ,CPU 只能运行单个线程,运行顺序取决于线程的优先级。如果在单位时间内线程未能完成执行,系统就会把线程的状态信息保存到线程的本地储存器(TLS)中,以便下次执行时恢复执行。因为 CPU 的处理速度很快,所以我们感知不到停顿。因为切换频密,所以多线程可被视作同时运行,而实际上这是假象。 在多核系统的一个单位时间内,进程或线程可以在不同的 CPU 中运行,实现真正的并行处理。 # 线程生命周期 线程生命周期开始于 System.Threading.Thread...
4.9k 4 分钟

# Socket Socket(计算机术语为:套接字)是计算机网络编程中的一种通信机制,使网络上的两个程序通过一个双向的通信连接实现数据的交换。它是一个抽象层,提供了一套标准的接口,使得应用程序可以通过这套接口与网络通信协议进行交互,实现数据传输和共享。 在网络编程中,Socket 通常被用来实现客户端和服务端之间的通信。客户端通过 Socket 连接到服务端,并向服务端发送数据请求,服务端接收请求并处理后,再将结果返回给客户端。这种通信方式可以用于实现各种不同类型的网络应用程序,如 Web 服务器、聊天软件、在线游戏等。 Socket...
1.6k 1 分钟

# 责任链模式 属于行为型模式。 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 优点: 降低耦合度。 简化了对象,使得对象不需要知道链的结构。 增强给对象指派职责的灵活性,可以随时增加或修改处理一个请求的结构。 易扩展。 缺点: 一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理 不正确的配置可能会造成循环调用(死循环) 可能会增加调试的难度 # 类图 # 代码 # 处理者抽象类 namespace...
2.9k 3 分钟

# 命令模式 属于行为型模式。 将一个请求封装成一个对象,从而可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。 优点: 能够比较容易地设计一个命令队列 在需要的情况下,可以较容易地将命令记入日志 允许接收请求的一方决定是否要否决请求 可以容易地实现对请求的撤销和重做 容易扩展 # 类图 # 代码 # 命令类 namespace BehavioralPatterns_CommandPattern{ /// <summary> /// 命令 /// </summary> public abstract...
1.2k 1 分钟

# 桥接模式 属于结构型模式。 将抽象部分(主体类)与实现部分(主题类成员)分离,使它们都可以独立的变化。 适用性: 不希望使用继承导致系统类的个数急剧增加 一个类存在多个维度的变化,且多个维度都需要进行扩展 # 类图 # 代码 # 拥有桥接关系的类 namespace StructuralPattern_BridgePattern{ /// <summary> /// 颜色 /// </summary> public abstract class Color { /// <summary>...
1.5k 1 分钟

# 迭代器模式 属于行为型模式。 提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。 现在,迭代器模式的实用价值远不如学习价值了,因为现在的高级编程语言已经把这个模式做在语言中了。CSharp 中的迭代器就是一个例子。 接下来讲解的内容不是传统的迭代器模式,而是复刻 foreach 的功能。 # 类图 # 代码 # 用于测试的类 namespace BehavioralPatterns_IteratorPattern{ public class Shape { public string Name; public...