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

什么是委派模式

虽然说委派模式不属于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源码中我们可以搜索一下,使用delegate关键词模糊查找下,但凡以Delegate结尾的都是委派模式的应用。

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

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

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

doDispatch()方法核心源码截图

应用场景

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

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

原文地址:https://www.cnblogs.com/happyone/p/12496880.html

时间: 2024-10-18 08:28:17

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

Spring 实现两种设计模式:工厂模式和单态模式

在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工厂模式可将Java 对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口) ,而不必关心实例的具体实现过程.这是面向接口编程的优势,能提高程序的解耦,避免所有的类以硬编码方式耦合在一起. 如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改:假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写

设计模式 - 委派模式

理解 首先委派模式不属于23种设计模式. 所谓委派,个人理解是:将为达到最终结果的事情交给其他人或中间人来干,我只要最终结果,其他的事情,由我委派的人来安排. 更直白的表达就是,比如,我们想要盖一栋楼房,盖完之后我要刷漆,这些事情我自己肯定不能做,所以我这时候就会去找一个"包工头"来帮我完成这件事情,我只要告诉"包工头"我要盖房子.我要给房子刷漆等命令,其他的事情我不管,最终能够交付给我这个刷完漆房子就行.那么"包工头"也不可能自己来干的吧,这个

Spring中的设计模式:模板模式

导读 模板模式在是Spring底层被广泛的应用,比如事务管理器的实现,JDBC模板的实现. 文章首发于作者的微信公众号[码猿技术专栏] 今天就来谈谈「什么是模板模式」.「模板模式的优缺点」.「模板模式的简单演示」.「模板模式在Spring底层的实现」. 什么是模板模式 模板模式首先要有一个抽象类,这个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 定义:「定义一个操作中的算法骨架,而将算法的一些步骤延

java 设计模式 --委派模式

委派模式(Delegate)原理: 类B和类A是两个互相没有任何关系的类,但是B具有和A一模一样的方法和属性:并且调用B中的方法/属性就是调用A中同名的方法和属性. B好像就是一个受A授权委托的中介,第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种公能,又能够很好的将A保护起来. 委派模式使得我们可以用聚合来代替继承,看如下代码: // 类模拟打印机Printer拥有针式打印机RealPrinter的实例 //Printer拥有的

委派模式和策略模式

一.委派模式 委派模式(Delegate Pattern):指负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果.(属于行为型模式,但它不属于GOF的23种设计模式之一.类名以Delegate和Dispatcher结尾的一般都是委派模式) 委派模式在Spring中应用非常多,大家常用的DispatcherServlet其实就用到了委派模式.现实生活中也常有委派的场景发生,例如:老板(Boss)给项目经理(Leader)

设计模式08-桥接模式

1. 概念 将抽象部分和它的实现分离,使他们都可以独立变化 个人理解:将接口(或者抽象类)对象作为业务对象中的成员变量达到“多维度的变化”  ,这里说的多维度变化指的就是一个接口或者抽象类的具体实现是有多个 例如: interface A{ //method } class Business{ private A a ; //将接口作为成员变量 public Business(A a){ this.a = a ; } } class A1 implements A{} class A2 impl

【设计模式】模板模式

引子 这是一个很简单的模式,却被非常广泛的使用. 之所以简单是因为在这个模式中仅仅使用到了继承关系. 继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子. “使用委派关系代替继承关系”, “尽量使用接口实现而不是抽象类继承”等等专家警告,让我们大家对继承“另眼相看”. 其实,继承还是有很多自身的优点所在.只是被大家滥用的似乎缺点更加明显了. 合理的利用继承关系,还是能对你的系统设计起到很好的作用的. 而模板方法模式就是其中的一个使用范例. 定义与结构 模板方法(Template Method)

设计模式之代理模式学习

代理模式是一种结构型模式,通常源于下边的情况:人们对于复杂的软件系统经常有一种处理手法,即添加一个间接层,从而对系统获得一种更为灵活,满足特定须要的解决方式.比例如以下图中,B有安全控制或者是缓存控制.B中存在A根本不须要知道的控制方式.A直接使用B,结构上复杂,实现也不方便.A直接使用B的方式,控制不够灵活,可能要用到A根本不知道的方式.添加一个间接层,从而对系统获得更为灵活.满足特定须要的解决方式.假如A须要调用B三次,B比方处理远程的另外一个进程,C做为B的代理人.A和C处于一个地址空间,

05.设计模式_建造者模式

转载自  http://www.cnblogs.com/zhili/p/BuilderPattern.html 一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到