Linux下的设计模式——委派模式(Delegate Pattern)深入浅出【建议新手收藏】

前言:学习目标:精简程序逻辑,提升代码的可读性。内容定位:希望通过对委派模式的学习,让自己写出更加优雅的代码的人群。

一、委派模式定义
委派模式(Delegate Pattern)的基本作用是负责任务的调度和分配任务,跟代理模式很像,可以看作是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果。
不属于GOF 23中设计模式之一
属于行为型模式
二、常见应用场景案例
DispatcherServlet
类名以Delegate结尾的
包含Dispatcher的一般都是委派模式
Spring框架IOC中的BeanDefinitionParserDelegate:Spring提供多种方式(java、xml、注解)配置bean,该类负责分发处理,注入的bean信息最终会被加载为一个BeanDefition对象(描述对象信息)
应用场景:解决多任务,又不希望把这些任务或者具体的实现让用户知道(不让用户直接交互),创建一个中间类,实现全权代理,达到对用户来说只有一个入口的目的。

三、简单代码案例
例子:老板需要安排任务给员工,但是又不能直接让老板去了解每个员工的擅长职能,就可以创建一个中间的经理职位负责了解职员的特长,分发任务。

boss类

public class Boss {

/**
 * 发任务
 * @param command
 * @param leader
 */
public void command(String command,Leader leader){
    leader.doing(command);
}

}
1
2
3
4
5
6
7
8
9
10
11
经理类

public class Leader {
// 预先知道每个员工的特长、特征,分发任务
private Map<String,IEmployee> register = new HashMap<String,IEmployee>();

public Leader(){
    register.put("加密",new EmployeeA());
    register.put("架构",new EmployeeB());
}

public void doing(String command){

// 交给指定的员工去做
register.get(command).doing(command);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
员工接口

public interface IEmployee {

/**
 * 做事
 * @param command
 */
void doing(String command);

}
1
2
3
4
5
6
7
8
员工A

public class EmployeeA implements IEmployee {
@Override
public void doing(String command) {
System.out.println(“我是员工A,我开始干活了,我擅长加密,执行”);
}
}
1
2
3
4
5
6
员工B

public class EmployeeB implements IEmployee {
@Override
public void doing(String command) {
System.out.println(“我是员工B,我擅长架构,我开始干活了”);
}
}
1
2
3
4
5
6
测试类

public class DelegateTest {

public static void main(String[] args) {
    new Boss().command("架构",new Leader());
}

}
1
2
3
4
5
6
四、SpringMvc的DispatcherServlet简单实现
DispatcherServlet是前端控制器委派模式的实现,提供Spring Web MVC的集中访问点,负责职责的分派

web.xml

Archetype Created Web Application delegateServlet com.zc.pattern.delegate.mvc.DispatcherServlet 1 delegateServlet /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 DispatcherServlet

package com.zc.pattern.delegate.mvc;

import com.zc.pattern.delegate.mvc.controllers.MemberController;
import com.zc.pattern.delegate.mvc.controllers.OrderController;
import com.zc.pattern.delegate.mvc.controllers.SystemController;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DispatcherServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// 完成调度
doDispach(req,resp);
}

private void doDispach(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    String uri = req.getRequestURI();
    if ("getMemberById".equals(uri)){
        String mid = req.getParameter("mid");
        new MemberController().getMemberById(mid);
    }else if ("getOrderById".equals(uri)){
        String oid = req.getParameter("oid");
        new OrderController().getOrderById(oid);
    }else if ("getSystemById".equals(uri)){
        new SystemController().logout();
    }else {
        resp.getWriter().write("404 not found");
    }
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
MemberController

public class MemberController {

public void getMemberById(String mid){
    System.out.println("获取员工id");
}

}
1
2
3
4
5
6
7
OrderController

public class OrderController {

public void getOrderById(String oid){
    System.out.println("获取订单id");
}

}
1
2
3
4
5
6
7
SystemController

public class SystemController {

public void logout(){
    System.out.println("退出");
}

}
1
2
3
4
5
6
7
为了答谢大家关注和支持,这次给大家准备了限时领取福利:阿里面试题、百度面试题、滴滴面试题、华为面试题、京东面试题、美团面试题、腾讯面试题、头条面试题、中兴面试题。
在这里插入图片描述
还等什么小编推荐自己的linuxC/C++语言交流群:【1106675687】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!前100名进群领取,额外赠送一份价值199的C/C++、linux资料包含(视频教程、电子书、实战项目及代码),下面部分展示。

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值