看见核心就是将通用方法封装在超类中,所以在当子类方法中有一些不变的和可变的行为,可以将不变的行为通过模板方法搬到父类,这样子类就不需要重复这些不变的部分。是不是很简单,设计模式就是对面向对象编程,封装继承多态的灵活使用。
3、Chain of Responsibility 责任链像公司内的请假流程,如果请很长时间,可能先有部门经理审批,部门经理说时间太长了,需要问下总经理。为请求创建了一个接受者对象的链,让请求者和接收者解耦。这种模式中,通常每个接收者都包含对另一个接收者的引用,这样如果这个接收者对象不能处理该请求就传递给下一个接收者。
上述结构图中首先定义一个Handler处理请求抽象类,里面设置了下一个接收者和处理请求的抽象方法。然后再ConcreateHandler子类中实现具体的请求处理,如果处理不了,就转发给下一个接收者。
abstract class Handler{
protected Handler successor;
public void SetSuccessor(Handler successor)
{
this.successor = successor;
}
public abstract void HandleRequest(int request);
}
class ConcreateHandler1 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request < 10)
{
Console.WriteLine($"{this.GetType().Name}处理请求 {request}");
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
核心就是拦截类都实现统一接口。Handler里聚合它自己,在HandlerRequest里判断是否能处理,如果不能就向下传递,要向谁传递就Set进去。所以这种方式是不确定哪个接收者会处理请求,通常在拦截器中使用,需要对消息的处理过滤很多道时。像击鼓传花。
4、Command 命令服务员,再炒个方便面,10个腰子,服务员就记下来交给炒菜师傅和烤串师傅,这就是命令模式。请求以命名的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命名的合适的对象,并把该命名传给相应的对象执行命名。并且支持可撤销操作,如果腰子很久没上来,可以通知服务员不要了。
核心就是定义三个角色:1、received真正的命令执行对象2、Command3、invoker使用命令对象的入口。最最终实现Invoker对象通过调用ExecuteCommand方法来调用具体命令Command的Excute方法,Excute方法里调用实际Received接收者动作。
abstract class Command{
protected Receiver receiver;
public Command(Receiver receiver)
{
this.receiver = receiver;
}
abstract public void Execute();
}
class ConcreteCommand : Command
{
public ConcreteCommand(Receiver receiver) : base(receiver)
{ }
public override void Execute()
{
receiver.Action();
}
}
class Invoker
{
private Command command;
public void SetCommand(Command command)
{
this.command = command;
}
public void ExecuteCommand()
{
command.Execute();
}
}
class Receiver
{
public void Action()
{
Console.WriteLine("执行请求!");
}
}