浅谈java常用的设计模式

委派模式(23种设计模式之外)

一、什么是委派模式?

	委派模式是一种基于java23中设计模式之外的一种设计模式!它结合了代理模式和策略模式的优点,主要负责任务的分发和调度。
	委派模式可以看做是代理模式的一种特殊情况,全权代理模式。只注重结果,不注重实现的过程。
	委派模式是一种行为型模式(行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。)

二、常见使用场景

委派模式从字面上来理解就是我将某件事委托某人进行处理,我不在乎你是如何具体完成我所委托的任务,只关心你有没有完成我所委派的事情。
委派模式常使用于:
  • DispatcherServlet (SSM项目中的核心控制分发器)
  • 类名以Delegate结尾的
  • 包含Dispatcher的一般都是委派模式

应用场景描述:
当有多个任务时,为了不让用户去安排这些任务的具体实现,而通过创建一个中间类来实现全权代理,代替用户进行任务的分发和安排。用户只需要提出任务需求即可,不需要去了解具体是怎么实现的,只需要得到最后的任务完成的结果即可。达到了对用户来说只有一个入口的目的。

现实生活中实例:
假如一个boss接到了一个大项目,但是他作为一个boss,不可能了解到每个开发人员擅长哪些方面的任务开发。所以他将这个项目全部交给项目经理,让项目经理来负责这个项目的分发和调度。因为项目经理了解手下的所有开发者的实力和所擅长的业务等等,所以能够将任务很好的划分到每一个开发人员,让他们来开发自己所需要的模块。最后等项目开发完毕后,项目经理将整合好的项目交给boss即可。

这个例子很好的诠释了委派模式的设计理念,boss只负责提出项目的要求,不需要去思考项目如何实现。而是直接交给项目经理来进行任务的分发和调度,boss本事只关注这个项目的结果。

映射到现实生活中就是用户在使用软件等东西时,只需要去提出自己想要的需求。自动有代理来帮他去分发调度和实现这个需求,不需要操心需求以为的事情,给用户一个良好的用户体验。

三、代码实现

需求:boss接到项目,交给项目经理。项目经理将任务分发调度给不同的开发人员实现该项目。

  1. boss(用户)接到了一个很大的项目,但他事情很多,不想去关心这个项目该怎么去实现。于是将这个项目交给项目经理(中间代理类),由项目经理全权代理这个项目。
	/**
 * boss类,boss负责接项目并将项目交给项目经理
 * @Auther: future
 * @Date: 2021/1/14 0014
 * @Description: top.zcwforever
 * @Version: 1.0
 */
@SpringBootTest
public class Boss {
    /**
     * 项目经理将接到的项目交给项目经理代理
     * @param projectName 项目名
     * @param projectManager 所要代理的项目经理
     */
    public void proxyProject(String projectName, ProjectManager projectManager) {
        projectManager.doing(projectName);
    }

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        new Boss().proxyProject("test", new ProjectManager());
    }
}

2.项目经理(中间代理类)收到了boss的交给的代理任务,开始分析并将项目交给相应的下属(最终实现类)实现

/**
 * 项目经理类,用于接收boss交给的项目,将任务交给下属开发人员进行开发。
 * @Auther: future
 * @Date: 2021/1/14 0014
 * @Description: top.zcwforever
 * @Version: 1.0
 */
public class ProjectManager {
    /*
     * 定义一个Map集合,用来处理项目分发
     * 一个注意点!每个雇员要实现一个Employees接口,接口里面有doing方法。
     * 体现了多态的机制,否则之后无法通过获取集合里面的元素来进行doing方法
      */
    
    Map<String,Employees> dispatcher = new HashMap();

    /**
     * 项目经理了解每个下属所擅长的技术,并将项目交给合适的下属完成
     */
    public ProjectManager() {
        dispatcher.put("develop",new EmployeeA());
        dispatcher.put("operation",new EmployeeB());
        dispatcher.put("test",new EmployeeC());
    }

    /**
     * 项目经理根据实际的项目来挑选合适的下属完成该工作
     * @param projectName 项目名称
     */
    public void doing(String projectName) {
        // 这个doing方法是接口中的doing方法,不是某一个雇员中的具体方法,体现了多态机制
        dispatcher.get(projectName).doing(projectName);

    }
}

3.员工可以抽象为一个员工类,他们共有一个doing方法,所以我们单独定义一个Employees接口,让每个员工去实现其doing方法。体现了java的多态机制

/**
 * @Auther: future
 * @Date: 2021/1/14 0014
 * @Description: top.zcwforever
 * @Version: 1.0
 */
public interface Employees {

    /**
     * 每个员工都有doing方法,根据项目名来执行具体的任务
     * @param projectName 项目名
     */
    public void doing(String projectName);
}

4.现在项目经理要开始安排员工做项目了,先把员工召集起来进行任务分发调度。

/**
 * 雇员A
 * @Auther: future
 * @Date: 2021/1/14 0014
 * @Description: top.zcwforever
 * @Version: 1.0
 */
public class EmployeeA implements Employees{
    public void doing(String projectName) {
        /**
         * 下属A擅长开发,当交给他开发任务时会执行开发任务
         */
        System.out.println("我是雇员A,我擅长" + projectName);
    }
}


/**
 * 雇员B
 * @Auther: future
 * @Date: 2021/1/14 0014
 * @Description: top.zcwforever
 * @Version: 1.0
 */
public class EmployeeB implements Employees {

    /**
     * 下属B擅长运维,当交给他运维任务时则会执行运维任务
     */
    public void doing(String projectName) {
        System.out.println("我是雇员B,我擅长" + projectName);
    }
}

/**
 * 雇员C
 * @Auther: future
 * @Date: 2021/1/14 0014
 * @Description: top.zcwforever
 * @Version: 1.0
 */
public class EmployeeC implements Employees {

    /**
     * 下属C擅长测试,当交给他测试任务时则会执行测试任务
     */
    public void doing(String projectName) {
        System.out.println("我是雇员C,我擅长" + projectName);
    }
}

5.测试结果
在这里插入图片描述

四、总结

  1. 在编写这篇博客时,感觉就如同讲给自己听。个人认为在阐述一个编程理念时,先通过生活中的例子让读者有一个大致的印象后再去分析代码会比直接让读者看代码去思考要便于理解的多。所以我采用的是先举例再代码实现的方式
  2. 委派模式能够让用户根据自己的实际需求来得到自己想要的结果,却让用户感觉不到这个需求的实现具体过程,保证了数据的安全性。
  3. spring中大量运用了委派模式,尤其是在SpringMVC里DispatcherServlet的使用。掌握委派模式对我们之后学习Spring源码会带来极大的便利。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值