策略模式
任何程序都离不开算法,我们需要通过算法去解决特定的问题
策略模式将算法的实现分别封装起来,让他们之间可以方便的进行替换,而不需要去改动代码。属于行为型模式。
举个例子:拼多多现在有促销活动,其优惠策略可能是拼团活动价格,优惠券抵扣,补贴价格,购物返现等…
如果直接写代码,那么就是在代码里写一堆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();
}
执行效果 如图:
责任链模式的优点:
- 将请求与处理解耦
- 可以方便地改变内部传递的规则, 动态添加新的执行节点或者删除节点
- 易于扩展,如果想要新增一个处理节点,非常方便
实际使用责任链的时候,一个请求既可以在被任一节点处理后直接结束,也可以走完整个链路再结束,具体视使用场景决定