程序设计中的主要设计模式通常分为三大类,共23种:
1. 创建型模式(Creational Patterns)
单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
工厂方法模式(Factory Method):定义创建对象的接口,由子类决定实例化哪个类。
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。
建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。
原型模式(Prototype):通过复制现有对象来创建新对象。
2. 结构型模式(Structural Patterns)
适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。
桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。
组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。
装饰器模式(Decorator):动态地给对象添加职责,相比生成子类更为灵活。
外观模式(Facade):为子系统中的一组接口提供一个统一的接口。
享元模式(Flyweight):通过共享技术有效地支持大量细粒度对象。
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
3. 行为型模式(Behavioral Patterns)
责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者与接收者耦合。
命令模式(Command):将请求封装为对象,使你可以用不同的请求对客户进行参数化。
解释器模式(Interpreter):给定一个语言,定义其文法的一种表示,并定义一个解释器。
迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。
中介者模式(Mediator):定义一个中介对象来封装一系列对象之间的交互。
备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。
状态模式(State):允许对象在其内部状态改变时改变其行为。
策略模式(Strategy):定义一系列算法,将它们封装起来,并使它们可以互相替换。
模板方法模式(Template Method):定义一个操作中的算法骨架,将一些步骤延迟到子类中。
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
4.责任链模式(Chain of Responsibility)解释
责任链模式是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。责任链模式将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。
核心思想
- 链式处理:将多个处理对象(Handler)链接在一起,形成一个链。
- 请求传递:请求沿着链传递,直到某个对象处理它。
- 解耦:请求的发送者不需要知道具体的处理者是谁,只需要将请求发送到链上。
适用场景
- 当一个请求需要由多个对象中的一个或多个来处理时。
- 当希望在不明确指定接收者的情况下,向多个对象中的一个发送请求。
- 当需要动态指定处理请求的对象时。
优点
- 降低耦合度:请求的发送者和处理者之间没有直接的依赖关系。
- 灵活性:可以动态地调整链中的处理对象。
- 扩展性:可以轻松地添加新的处理对象。
缺点
- 请求可能不会被处理:如果链中没有对象处理请求,请求可能会被忽略。
- 性能问题:如果链过长,可能会影响性能。
5.责任链模式的 C# 实现
以下是一个简单的责任链模式示例,模拟一个审批流程:员工提交请假申请,审批链包括组长、经理和总监,每个角色根据自己的权限处理请求。
代码实现
csharp
using System;
// 抽象处理者(Handler)
abstract class Approver
{
protected Approver NextApprover; // 下一个处理者
public void SetNextApprover(Approver nextApprover)
{
this.NextApprover = nextApprover;
}
public abstract void ProcessRequest(LeaveRequest request);
}
// 具体处理者:组长
class TeamLeader : Approver
{
public override void ProcessRequest(LeaveRequest request)
{
if (request.Days <= 3)
{
Console.WriteLine($"组长批准了 {request.EmployeeName} 的 {request.Days} 天请假申请。");
}
else if (NextApprover != null)
{
NextApprover.ProcessRequest(request); // 传递给下一个处理者
}
}
}
// 具体处理者:经理
class Manager : Approver
{
public override void ProcessRequest(LeaveRequest request)
{
if (request.Days > 3 && request.Days <= 7)
{
Console.WriteLine($"经理批准了 {request.EmployeeName} 的 {request.Days} 天请假申请。");
}
else if (NextApprover != null)
{
NextApprover.ProcessRequest(request); // 传递给下一个处理者
}
}
}
// 具体处理者:总监
class Director : Approver
{
public override void ProcessRequest(LeaveRequest request)
{
if (request.Days > 7)
{
Console.WriteLine($"总监批准了 {request.EmployeeName} 的 {request.Days} 天请假申请。");
}
else if (NextApprover != null)
{
NextApprover.ProcessRequest(request); // 传递给下一个处理者
}
}
}
// 请求类
class LeaveRequest
{
public string EmployeeName { get; set; }
public int Days { get; set; }
public LeaveRequest(string employeeName, int days)
{
this.EmployeeName = employeeName;
this.Days = days;
}
}
// 客户端代码
class Program
{
static void Main(string[] args)
{
// 创建处理者
Approver teamLeader = new TeamLeader();
Approver manager = new Manager();
Approver director = new Director();
// 设置责任链
teamLeader.SetNextApprover(manager);
manager.SetNextApprover(director);
// 创建请求
LeaveRequest request1 = new LeaveRequest("张三", 2);
LeaveRequest request2 = new LeaveRequest("李四", 5);
LeaveRequest request3 = new LeaveRequest("王五", 10);
// 处理请求
teamLeader.ProcessRequest(request1); // 组长处理
teamLeader.ProcessRequest(request2); // 经理处理
teamLeader.ProcessRequest(request3); // 总监处理
}
}
代码说明
抽象处理者(
Approver
):- 定义了一个抽象类
Approver
,包含一个指向下一个处理者的引用NextApprover
。 - 提供了一个抽象方法
ProcessRequest
,用于处理请求。
- 定义了一个抽象类
具体处理者:
TeamLeader
、Manager
和Director
是具体的处理者,分别实现了ProcessRequest
方法。- 每个处理者根据自己的权限决定是否处理请求,如果不能处理,则将请求传递给下一个处理者。
请求类(
LeaveRequest
):- 表示一个请假请求,包含员工姓名和请假天数。
客户端代码:
- 创建处理者对象并设置责任链。
- 创建不同的请假请求,并将请求发送到责任链的第一个处理者(
TeamLeader
)。
输出结果
组长批准了 张三 的 2 天请假申请。
经理批准了 李四 的 5 天请假申请。
总监批准了 王五 的 10 天请假申请。
6.总结
通过责任链模式,我们可以将请求的处理逻辑分散到多个对象中,从而实现解耦和灵活性。在实际开发中,责任链模式常用于审批流程、日志处理、异常处理等场景。