结合JDK,Spring,Mybatis,Netty,Tomcat,Dubbo等经典框架的源码对设计模式展开分析(十)

  • 策略模式(Strategy Pattern)

定义:又叫做政策模式,他将定义的算法族封装起来,让他们可以互相替换,让算法的扩展独立于使用它的用户

应用场景:比如你有一个产品类实现了一个功能,这个功能比较复杂,需要依靠一个可以抽象出来的算法(方法),这个算法经常需要扩展,那么就可以用策略模式,产品类依赖于抽象的算法类,而产品的功能调用具体注入的算法(策略)的抽象(抽象策略)

角色:上下文角色,抽象策略角色,具体策略角色

策略模式在框架中的应用:

JDK中的比较器Comparator接口,compare()方法就是策略抽象的实现

Spring源码中Resource接口,我们经常用它的子类来完成一下功能

Spring源码中对于对象的初始化,也采用了策略模式,不同类采用不同的初始化策略,首先是一个InstantiationStrategy接口,下面有两个策略类SimpleInstantiationStrategy和CglibSubclassingInstantiationStrategy

优点:符合开闭原则,避免使用多重条件判断语句

缺点:客户端必须知道所有的策略,代码中策略类会非常多

  • 责任链模式(Chain of Responsibility Pattern)

定义:将链中每一个节点都看作一个对象,每个节点处理的请求均不同,当一个请求从链式的首端发出时,会沿着责任链预设的路径一次传递到每个节点对象,直到被链中的某个对象处理为止

常用于业务流程的环节设计中,专业的事情交给专业的人去做,主要解耦了请求和处理

应用场景:多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定

可动态指定一组对象处理请求

角色:抽象处理者,具体处理者

通用写法:

package com.ChainPattern;

/**
 * @author yangxiaozhen
 * @date 2022/5/19-22:00
 */
public abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler handler) {
        this.nextHandler = handler;
    }

    public abstract void handleRequest(String request);

    public static void main(String[] args) {
        Handler handler = new ConceteHandlerB();
        handler.setNextHandler(new ConcreteHandlerA());
        handler.handleRequest("requestA");
    }
}
package com.ChainPattern;

/**
 * @author yangxiaozhen
 * @date 2022/5/19-22:02
 */
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(String request) {
        if ("requestA".equals(request)){
            System.out.println(this.getClass().getSimpleName()+"deal with request:"+request);
            return;
        }else {
            System.out.println("不关a的事");
        }
        if (this.nextHandler!=null){
            this.nextHandler.handleRequest(request);
        }
    }
}
package com.ChainPattern;

/**
 * @author yangxiaozhen
 * @date 2022/5/19-22:05
 */
public class ConceteHandlerB extends Handler {
    @Override
    public void handleRequest(String request) {
        if ("requestB".equals(request)){
            System.out.println(this.getClass().getSimpleName()+"deal with request:"+request);
            return;
        }else {
            System.out.println("不关b的事");
        }
        if (this.nextHandler!=null){
            this.nextHandler.handleRequest(request);
        }
    }
}

使用责任链模式和建造者模式设计热插拔权限管理:

package com.ChainPattern;

/**
 * @author yangxiaozhen
 * @date 2022/5/19-22:47
 */
public abstract class NewHandler {
    protected NewHandler chain;

    public void next(NewHandler newHandler) {
        this.chain = newHandler;
    }

    public abstract void doHandle(Member member);

    public static class Builder<T> {
        //保存链表的头build时return出去
        private NewHandler head;
        private NewHandler tail;

        public Builder addHandler(NewHandler handler) {
            if (this.head == null) {
                this.head = this.tail = handler;
                return this;
            }
            this.tail.next(handler);
            this.tail = handler;
            return this;
        }

        public NewHandler build() {
            return this.head;
        }
    }
}

在Spring源码中的应用:

FilterChain接口下的实现类,通过维护一个list装配了所有需要的filter,然后调用doFilter的时候遍历调用filter list

优点:链路结构灵活,可以通过改变链路结构动态的改变责任,易于扩展符合开闭原则

缺点:责任链太长可能会影响性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值