原型模式原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。概要原型模式意图:使用原型实例指定要创建对象的种类,并通过拷贝这些原型创建新的对象。主要解决:在运行时动态建立和删除原型。何时使用系统应独立于产品的创建、构成和表示。需要在运行时指定实例化的类,例如通过动态加载。避免创建与产品类层次平行的工厂类层次。类的实例只能有几种不同状态组合,克隆原型比手工实例化更方便。如何解决通过已有的一个原型对象,快速生成与原型对象相同的实例。关键代码实现克隆操作:在 Java 中,实现 Cloneable 接口,重写 clone() 方法。在 .NET 中,使用 Object 类的 MemberwiseClone() 方法实现浅拷贝,或通过序列化实 ...
单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。注意:
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。
概要单例模式(Singleton Pattern)意图确保一个类只有一个实例,并提供一个全局访问点来访问该实例。主要解决频繁创建和销毁全局使用的类实例的问题。何时使用当需要控制实例数目,节省系统资源时。如何解决检查系统是否已经存在该单例,如果存在则返回该实例;如果不存在则创建一个新实例。关键代码构造函数是私有的。应用实例一个班级只有一个班主任。Windows 在多进程多线程环境下操作文件时,避免多个进程或线程同时操作一个文件,需要通过唯一实例进行处理。设备管理器设计为单例 ...
前端控制器模式前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
前端控制器(Front Controller) - 处理应用程序所有类型请求的单个处理程序,应用程序可以是基于 web 的应用程序,也可以是基于桌面的应用程序。调度器(Dispatcher) - 前端控制器可能使用一个调度器对象来调度请求到相应的具体处理程序。视图(View) - 视图是为请求而创建的对象。
概要意图使用一个中心控制器(或处理器)来转发客户端请求到适当的处理程序。主要解决的问题
解决Web应用程序中请求处理分散的问题,提供统一的请求处理入口。
使用场景
当需要对Web应用程序中的请求进行统一管理和分发时。
实现方式
前端控制器:作为请求的单一入口点,负责请求的接收和转发。视图:用于呈现处理结果。处理程序:实际执行请求处理的组件。
关键代码
前端控制器:包含逻辑以决定将请求转发到哪个处理程序。 ...
传输对象模式传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为。服务器端的业务类通常从数据库读取数据,然后填充 POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只读的。客户端可以创建自己的传输对象,并把它传递给服务器,以便一次性更新数据库中的数值。以下是这种设计模式的实体。
业务对象(Business Object) - 为传输对象填充数据的业务服务。传输对象(Transfer Object) - 简单的 POJO,只有设置/获取属性的方法。客户端(Client) - 客户端可以发送请求或者发送传输对象到业务对象。
概要意图用于简化网络或应用程序层之间的数据传输。它通过创建一个包含多个属性的类来封装数据,这些属性代表需要传输的数据。主要解决的问题
解决在分布式系统中,尤其是多层应用程序中,数据在层与层之间传输时的效率和封装性问题。
使 ...
代理模式在代理模式(Proxy Pattern)中,一个类代表另一个类的功能,这种类型的设计模式属于结构型模式。代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的请求转发给目标对象,同时可以在转发请求前后进行额外的处理。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。介绍意图为其他对象提供一种代理以控制对这个对象的访问。主要解决的问题
代理模式解决的是在直接访问某些对象时可能遇到的问题,例如对象创建成本高、需要安全控制或远程访问等。
使用场景
当需要在访问一个对象时进行一些控制或额外处理时。
实现方式
增加中间层:创建一个代理类,作为真实对象的中间层。代理与真实对象组合:代理类持有真实对象的引用,并在访问时进行控制。
关键代码
代理类:实现与真实对象相同的接口,并添加额外的控制逻辑。真实对象:实际执行任务的对象。
应用实例
快捷方式:Windows系统中的快捷方式作为文件或程序的代理。角色扮演:孙悟空作为高翠兰的代理,猪八戒无法区分。代售点:购买火车票时,代售点作为火车站的代理。支票:作为银行账户资金的代理,控制资 ...
享元模式享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。概要意图通过共享对象来减少创建大量相似对象时的内存消耗。。主要解决的问题
避免因创建大量对象而导致的内存溢出问题。通过共享对象,提高内存使用效率。
使用场景
当系统中存在大量相似或相同的对象。对象的创建和销毁成本较高。对象的状态可以外部化,即对象的部分状态可以独立于对象本身存在。
实现方式
定义享元接口:创建一个享元接口,规定可以共享的状态。创建具体享元类:实现该接口的具体类,包含内部状态。使用享元工厂:创建一个工厂类,用于管理享元对象的创建和复用。
关键代码
HashMap:使用哈希表存储已经创建的享元对象,以便快速检索。
应用实例
Java中的String对象: ...
中介者模式中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性,属于行为型模式。中介者模式定义了一个中介对象来封装一系列对象之间的交互。中介者使各对象之间不需要显式地相互引用,从而使其耦合松散,且可以独立地改变它们之间的交互。介绍意图通过引入一个中介者对象来封装和协调多个对象之间的交互,从而降低对象间的耦合度。主要解决的问题
解决对象间复杂的一对多关联问题,避免对象之间的高度耦合,简化系统结构。
使用场景
当系统中多个类相互耦合,形成网状结构时。
实现方式
定义中介者接口:规定中介者必须实现的接口。创建具体中介者:实现中介者接口,包含协调各同事对象交互的逻辑。定义同事类:各个对象不需要显式地相互引用,而是通过中介者来进行交互。
关键代码
中介者:封装了对象间的交互逻辑。同事类:通过中介者进行通信。
应用实例
WTO:中国加入WTO后,各国通过WTO进行贸易,简化了双边关系。机场调度系统:协调飞机起降、跑道使用等。MVC框架:控制器作为模型和视图的中介者。
优点
降低复杂度:将多个对象间的一对多关系转换为一对一关系。解耦:对象之间不再直接引用,通过中介者进 ...
业务代表模式业务代表模式(Business Delegate Pattern)用于对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。在业务层中我们有以下实体。
客户端(Client) - 表示层代码可以是 JSP、servlet 或 UI java 代码。业务代表(Business Delegate) - 一个为客户端实体提供的入口类,它提供了对业务服务方法的访问。查询服务(LookUp Service) - 查找服务对象负责获取相关的业务实现,并提供业务对象对业务代表对象的访问。业务服务(Business Service) - 业务服务接口。实现了该业务服务的实体类,提供了实际的业务实现逻辑。
概要意图抽象和封装应用程序的访问逻辑,从而为表示层提供对业务逻辑层的访问。主要解决的问题
解决表示层与业务逻辑层之间的耦合问题,允许表示层通过业务代表间接访问业务逻辑层。
使用场景
当需要在多层应用程序中清晰地分离表示层和业务逻辑层时。
实现方式
业务代表接口:定义访问业务逻辑的方法。业务代表实现:实现业务代表接口,封装调用业务逻辑层的逻辑。业务服务:业务 ...
MVC 模式MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。View(视图) - 视图代表模型包含的数据的可视化。Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
概要意图将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),以实现关注点分离。主要解决的问题
解决了应用程序中业务逻辑、数据和界面显示的耦合问题,使得开发和维护更加清晰和简单。
使用场景
当需要将数据、业务逻辑和界面显示分离,以便于独立开发和维护时。
实现方式
模型(Model):负责数据和业务逻辑,通常包含数据存储、检索和业务规则。视图(View):负责显示数据(模型)的用户界面,不包含业务逻辑。控制器(Controller):接收用户的输入,调用模型和视图去完成用户的请求。
关键代码
模型:包含业务逻辑和 ...
C# 预处理器指令
预处理器指令(Preprocessor Directives)指导编译器在实际编译开始之前对信息进行预处理。通过这些指令,可以控制编译器如何编译文件或编译哪些部分。常见的预处理器指令包括条件编译、宏定义等。所有的预处理器指令都是以 # 开始,且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号 ; 结束。C# 编译器没有一个单独的预处理器,但是,指令被处理时就像是有一个单独的预处理器一样。在 C# 中,预处理器指令用于在条件编译中起作用。与 C 和 C++ 不同的是,它们不是用来创建宏。一个预处理器指令必须是该行上的唯一指令。
C# 预处理器指令列表下表列出了 C# 中可用的预处理器指令:
指令描述#define定义一个符号,可以用于条件编译。#undef取消定义一个符号。#if开始一个条件编译块,如果符号被定义则包含代码块。#elif如果前面的 #if 或 #elif 条件不满足,且当前条件满足,则包含代码块。#else如果前面的 #if 或 #elif 条件不满足,则包含代码块。#endif结束一个条件编译块。#warnin ...