说说设计模式~委派模式

回到目录

概述

委派模式(Delegate Pattern)又叫作委托模式,是一种面向对象的设计模式,允许对象组合实现与继承相同的代码重用。它的基本作用就是负责任务的调用和分配,是一种特殊的静态代理模式,可以理解为全权代理模式,但是代理模式注重过程,而委派模式注重结果。委派模式属于行为型设计模式,不属于GoF的23种设计模式。

使用场景

  1. 任务分发:当一个任务需要被分发给多个不同的执行者来完成时,委派模式可以将任务的分发和执行解耦。委派者负责接收任务并将任务委派给具体的执行者进行处理。

  2. 复杂任务处理:当一个任务较为复杂,需要由多个不同的子任务协同完成时,委派模式可以将任务拆分成多个子任务,由不同的执行者负责处理各自的子任务。

  3. 中央调度:当需要一个中央调度者来协调和管理多个任务的执行时,委派模式可以使中央调度者作为委派者,将任务委派给不同的执行者来完成。

  4. 策略选择:当根据不同的条件或参数选择不同的策略或实现方式时,委派模式可以根据条件选择合适的实现类来执行任务。

  5. 事件驱动:当事件触发后需要将事件分发给不同的处理者来处理时,委派模式可以作为事件的委派者,根据事件的类型将事件分发给对应的处理者进行处理。

总而言之,委派模式适用于任务分发和执行的场景,可以将任务的分发和执行进行解耦,提高代码的可维护性和扩展性,同时实现任务的灵活分配和处理。

在代码中的体现

下面是一个简单的示例,使用Java代码演示委派模式的实现:

// 委派任务的接口
public interface Task {
    void execute();
}

// 具体的任务实现类A
public class TaskA implements Task {
    @Override
    public void execute() {
        System.out.println("执行任务A");
    }
}

// 具体的任务实现类B
public class TaskB implements Task {
    @Override
    public void execute() {
        System.out.println("执行任务B");
    }
}

// 委派者
public class TaskDelegate {
    private Task task;

    public void setTask(Task task) {
        this.task = task;
    }

    public void doTask() {
        task.execute();
    }
}

// 客户端
public class Main {
    public static void main(String[] args) {
        TaskDelegate delegate = new TaskDelegate();
        
        // 委派给任务A执行
        delegate.setTask(new TaskA());
        delegate.doTask();
        
        // 委派给任务B执行
        delegate.setTask(new TaskB());
        delegate.doTask();
    }
}

在上面的示例中,Task 接口定义了任务的执行方法 execute()TaskATaskB 是具体的任务实现类。TaskDelegate 充当委派者的角色,负责接收任务并将任务委派给具体的实现类来执行。Main 类作为客户端示例,创建委派者对象并通过设置不同的任务来执行。

在这个例子中,TaskDelegate 将任务的执行委派给了不同的具体任务类,根据设置的任务类型,委派者会将任务分发给不同的实现类来执行。通过委派模式,委派者可以将具体的任务分发给不同的执行者,实现任务的灵活分配和执行。

在spring中的应用

当涉及到Spring框架中的委派模式时,最典型的例子就是Spring的核心Web组件之一——DispatcherServlet。

在Spring MVC中,DispatcherServlet充当了前端控制器(Front Controller)的角色。它是客户端请求的中央调度者,负责接收所有的HTTP请求,并将请求委派给合适的处理器(Handler)进行处理。

DispatcherServlet的工作流程如下:

  1. 客户端发起HTTP请求到DispatcherServlet。

  2. DispatcherServlet接收到请求后,根据请求的URL路径(或其他条件)选择合适的处理器来处理请求。

  3. DispatcherServlet将请求委派给选择的处理器进行处理。

  4. 处理器执行业务逻辑,生成相应的结果。

  5. 处理器将结果返回给DispatcherServlet。

  6. DispatcherServlet负责将处理器的结果进行包装,如渲染视图、返回JSON数据等。

  7. DispatcherServlet将最终结果返回给客户端。

在这个过程中,DispatcherServlet充当了委派者的角色,根据请求的URL路径选择合适的处理器来处理请求。DispatcherServlet并不直接处理请求,而是将请求委派给具体的处理器,可以是Controller类或其他处理组件。通过委派模式,DispatcherServlet实现了请求的分发和处理的解耦,具体的处理逻辑由处理器负责完成。

DispatcherServlet的配置可以在Spring的配置文件(如XML配置文件)中进行,指定URL路径和对应的处理器的映射关系。这样,根据不同的URL路径,DispatcherServlet就能够将请求委派给不同的处理器进行处理。

需要注意的是,DispatcherServlet不仅仅只使用了委派模式,它还涉及其他设计模式和技术,如适配器模式、模板方法模式、策略模式等,以实现全面的请求处理流程和灵活的扩展机制。
回到目录

posted @ 2023-06-28 10:33  张占岭  阅读(112)  评论(0编辑  收藏  举报