【设计模式】策略模式和责任链模式

策略模式

任何程序都离不开算法,我们需要通过算法去解决特定的问题
策略模式将算法的实现分别封装起来,让他们之间可以方便的进行替换,而不需要去改动代码。属于行为型模式。

举个例子:拼多多现在有促销活动,其优惠策略可能是拼团活动价格,优惠券抵扣,补贴价格,购物返现等…

如果直接写代码,那么就是在代码里写一堆if … else…,会使得代码非常复杂和臃肿,这个时候就需要策略模式了

适合场景

  • 针对同一类问题,不同场景有不同的实现
  • 算法需要根据场景进行自由切换

策略模式主要包含三种角色:
Context :用来操作算法/策略的上下文环境
Strategy抽象策略角色: 规定算法的接口
ConcreteStrategy : 具体的算法实现

public interface IPromotionStrategy {
    
    

    void deals();
}

public class GroupBuyPromotionStrategy implements IPromotionStrategy{
    
    

    @Override
    public void deals() {
    
    
        System.out.println("拼团成功,享受团购价");
    }
}

public class EmptyPromotionStrategy implements IPromotionStrategy {
    
    

    @Override
    public void deals() {
    
    
        System.out.println("原价购买");
    }
}

public class CouponPromotionStrategy implements IPromotionStrategy{
    
    

    @Override
    public void deals() {
    
    
        System.out.println("领取优惠券,参与促销");
    }
}

public class PromotionStrategyFactory {
    
    

    private static Map<PromotionType, IPromotionStrategy> map = new HashMap<>();

    private static EmptyPromotionStrategy empty = new EmptyPromotionStrategy();

    static {
    
    
        map.put(PromotionType.GROUPBUY, new GroupBuyPromotionStrategy());
        map.put(PromotionType.COUNPON, new CouponPromotionStrategy());
    }

    public IPromotionStrategy getPromotion(PromotionType type) {
    
    
        if (map.containsKey(type)) {
    
    
            return map.get(type);
        }
        return empty;
    }

    enum PromotionType {
    
    
        GROUPBUY, COUNPON;
    }

}

    public static void main(String[] args) {
    
    
        PromotionStrategyFactory factory = new PromotionStrategyFactory();
        IPromotionStrategy strategy = factory.getPromotion(PromotionStrategyFactory.PromotionType.COUNPON);
        strategy.deals();
    }

责任链模式

责任链模式就是将请求沿着处理链进行发送,每个链节点收到请求后,都可以对请求进行处理或者将其传递给链上的下一个节点。属于行为型设计模式。

我们平时的公文审批就属于经典的责任链模式

责任链模式主要包含两个角色:
抽象Handler: 定义处理接口,并维护下一个处理Handler的引用
具体处理者: 对请求进行处理;如果不处理则转发给下一个Handler

使用场景:

  • 多条件的流程判断,eg.权限控制
  • 系统审批流程

现在有一个db的操作,需要经过组长,领导,DBA的三重审批才可以执行,使用责任链代码实现如下

public abstract class Handler{
    
    

    private Handler nextHandler;
    
    //判断是否有下一个handler,有的话则继续移交给下一个handler处理
    public void handleRequest() {
    
    
        handle();
        if (this.nextHandler != null) {
    
    
            this.nextHandler.handleRequest();
        }
    }

    abstract void handle();
    
    //返回当前的handler,便于链式构建执行链
    public Handler setNextHandler(Handler nextHandler) {
    
    
        this.nextHandler = nextHandler;
        return nextHandler;
    }

}

public class TeamLeaderHandler extends Handler{
    
    

    @Override
    void handle() {
    
    
        System.out.println("组长审批通过....");
    }
}

public class LeaderHandler extends Handler{
    
    

    @Override
    void handle() {
    
    
        System.out.println("领导审批通过....");
    }
}

public class DBAHandler extends Handler{
    
    

    @Override
    void handle() {
    
    
        System.out.println("DBA审批通过并执行....");
    }
}
public static void main(String[] args) {
    
    
        TeamLeaderHandler handler = new TeamLeaderHandler();
        handler.setNextHandler(new LeaderHandler())
                .setNextHandler(new DBAHandler());
        handler.handleRequest();
    }

执行效果 如图:
在这里插入图片描述

责任链模式的优点:

  1. 将请求与处理解耦
  2. 可以方便地改变内部传递的规则, 动态添加新的执行节点或者删除节点
  3. 易于扩展,如果想要新增一个处理节点,非常方便

实际使用责任链的时候,一个请求既可以在被任一节点处理后直接结束,也可以走完整个链路再结束,具体视使用场景决定

猜你喜欢

转载自blog.csdn.net/qq_35448165/article/details/129319055
今日推荐