设计模式之委派模式,大名鼎鼎的Spring都在用

栏目: IT技术 · 发布时间: 4年前

内容简介:虽然说委派模式不属于Gof23中设计模式,但这并不影响它成为一种经典的设计模式。“委派”字面意思就是指派一件事情给某人。类比到生活中的场景,比如项目leader指派开发任务给下面的猿猿们。这听起来有点像静态代理,不过还是不一样的,你品,你细品!代理强调的是过程,主要是要在代理过程中加入一些动作的,而委派主要是分配和分发。我们先新建一个业务处理接口BusinessService

什么是委派模式

虽然说委派模式不属于Gof23中设计模式,但这并不影响它成为一种经典的设计模式。

“委派”字面意思就是指派一件事情给某人。类比到生活中的场景,比如项目leader指派开发任务给下面的猿猿们。这听起来有点像静态代理,不过还是不一样的,你品,你细品!代理强调的是过程,主要是要在代理过程中加入一些动作的,而委派主要是分配和分发。

代码实现

我们先新建一个业务处理接口BusinessService

public interface BusinessService {
    void doService();
}

新建两个实现类LoginService和OrderService

public class LoginService implements BusinessService{
    public void doService() {
        System.out.println("处理登录相关业务");
    }
}

public class OrderService implements BusinessService{
    public void doService() {
        System.out.println("订单业务模块");
    }
}

新建一个枚举类,表示不同的业务类型,这里假设就两个,login和order

public enum ServerType {
    LOGIN,ORDER;
}

新建一个业务查找类,主要是用于根据不用的业务类型选择不同的业务组件提供服务。

public class BussinessLookup {
    private OrderService orderService;

    private LoginService loginService;

    /**
     * 查找对应的服务
     * @param serverType
     * @return
     */
    public BusinessService getBusinessService(ServerType serverType){
        if(serverType.equals(ServerType.LOGIN)){
            return loginService;
        }else{
            return orderService;
        }
    }

    public void setOrderService(OrderService orderService) {
        this.orderService = orderService;
    }

    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }
}

接下来,关键的类来了,委派类。做的工作主要是分发。

public class BusinessDelegate {
    private BussinessLookup bussinessLookup;

    private BusinessService businessService;

    private ServerType serverType;

    public void setBussinessLookup(BussinessLookup bussinessLookup) {
        this.bussinessLookup = bussinessLookup;
    }

    public void setServerType(ServerType serverType) {
        this.serverType = serverType;
    }

    /**
     * 委派方法,其实最终调用的是业务类的方法
     */
    public void doTask(){
        businessService = bussinessLookup.getBusinessService(serverType);
        businessService.doService();
    }
}

我们再来个客户端类,也就是请求类,它通过委派类完成工作。就是说我不需要知道在幕后到底是哪个业务组件在处理,我只需要给你请求,你帮我完成好任务就OK.。说明白点,委派类就是做了一层封装和抽象,不将业务处理的大量组件暴露给请求层或者说是视图层。

public class Client {
    private BusinessDelegate businessDelegate;

    public Client(BusinessDelegate businessDelegate) {
        this.businessDelegate = businessDelegate;
    }

    public void doTask(){
        businessDelegate.doTask();
    }
}

好了,我们写个Main测试一下。

public class AppMain {
    public static void main(String[] args) {
        BusinessDelegate businessDelegate = new BusinessDelegate();
        BussinessLookup bussinessLookup = new BussinessLookup();
        bussinessLookup.setLoginService(new LoginService());
        bussinessLookup.setOrderService(new OrderService());

        businessDelegate.setBussinessLookup(bussinessLookup);
        businessDelegate.setServerType(ServerType.LOGIN);
        Client client = new Client(businessDelegate);
        client.doTask();

//        businessDelegate.setServerType(ServerType.ORDER);
//        client.doTask();
    }
}

结果:

处理登录相关业务

在这里,非常有必要看下类图

设计模式之委派模式,大名鼎鼎的Spring都在用

在Spring源码中应用

在Spring源码中我们可以搜索一下,使用delegate关键词模糊查找下,但凡以Delegate结尾的都是委派模式的应用。

比如:BeanDefinitionParserDelegate、ConstructorDelegate、MultipartResolutionDelegate、TypeConverterDelegate等。

当然了,我们熟知的DispatcherServlet 虽然没带delegate,但也是委派模式的一种实现。

前端请求都统一走到DispatcherServlet 的doService()方法中,然后在doService()方法中调用doDispatch()方法,在doDispatch()方法中,会获取业务处理的handler,执行handle()方法处理请求。

doDispatch()方法核心源码截图

设计模式之委派模式,大名鼎鼎的Spring都在用

应用场景

  1. 当你要实现表现层和业务层之间的松耦合的时候。
  2. 当你想要编排多个服务之间的调用的时候。
  3. 当你想要再封装一层服务查找和调用时候

公众号:二营长的笔记

免费领资料:公众号内回复“二营长”


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

解构产品经理:互联网产品策划入门宝典

解构产品经理:互联网产品策划入门宝典

电子工业出版社 / 2018-1 / 65

《解构产品经理:互联网产品策划入门宝典》以作者丰富的职业背景及著名互联网公司的工作经验为基础,从基本概念、方法论和工具的解构入手,配合大量正面或负面的案例,完整、详细、生动地讲述了一个互联网产品经理入门所需的基础知识。同时,在此基础上,将这些知识拓展出互联网产品策划的领域,融入日常工作生活中,以求职、沟通等场景为例,引导读者将知识升华为思维方式。 《解构产品经理:互联网产品策划入门宝典》适合......一起来看看 《解构产品经理:互联网产品策划入门宝典》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具