帮你整理了一份设计模式速查手册 (8)

帮你整理了一份设计模式速查手册

看见核心就是将通用方法封装在超类中,所以在当子类方法中有一些不变的和可变的行为,可以将不变的行为通过模板方法搬到父类,这样子类就不需要重复这些不变的部分。是不是很简单,设计模式就是对面向对象编程,封装继承多态的灵活使用。

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("执行请求!");
    }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdydg.html