设计模式系列之策略模式

一 策略模式的本质
策略模式的本质是一个接口有多个实现类,而每种实现类会处理某一种情况。
public interface PrizeSender {

/**

  • 用于判断当前实例是否支持当前奖励的发放
    */
    boolean support(SendPrizeRequest request);

/**

  • 发放奖励
    */
    void sendPrize(SendPrizeRequest request);

}
该接口中主要有两个方法:support()和sendPrize(),其中support()方法主要用于判断各个子类是否支持当前类型数据的处理,而sendPrize()则主要是用于进行具体的业务处理的,比如这里奖励的发放。下面就是我们三种不同类型的奖励发放的具体代码:
// 积分发放
@Component
public class PointSender implements PrizeSender {

@Override
public boolean support(SendPrizeRequest request) {
return request.getPrizeType() == PrizeTypeEnum.POINT;
}

@Override
public void sendPrize(SendPrizeRequest request) {
System.out.println(“发放积分”);
}
}
// 虚拟币发放
@Component
public class VirtualCurrencySender implements PrizeSender {

@Override
public boolean support(SendPrizeRequest request) {
return PrizeTypeEnum.VIRTUAL_CURRENCY == request.getPrizeType();
}

@Override
public void sendPrize(SendPrizeRequest request) {
System.out.println(“发放虚拟币”);
}
}
// 现金发放
@Component
public class CashSender implements PrizeSender {

@Override
public boolean support(SendPrizeRequest request) {
return PrizeTypeEnum.CASH == request.getPrizeType();
}

@Override
public void sendPrize(SendPrizeRequest request) {
System.out.println(“发放现金”);
}
}
这里可以看到,在每种子类型中,我们只需要在support()方法中通过request的某个参数来控制当前request是否是当前实例能够处理的类型,如果是,则外层的控制逻辑就会将request交给当前实例进行处理。关于这个类的设计,有几个点需要注意:
使用@Component注解对当前类进行标注,将其声明为Spring容器所管理的一个bean;
声明一个返回boolean值的类似于support()的方法,通过这个方法来控制当前实例是否为处理目标request的实例;
声明一个类似于sendPrize()的方法用于处理业务逻辑,当然根据各个业务的不同声明的方法名肯定是不同的,这里只是一个对统一的业务处理的抽象;
无论是support()方法还是sendPrize()方法,都需要传一个对象进行,而不是简简单单的基本类型的变量,这样做的好处是后续如果要在Request中新增字段,那么就不需要修改接口的定义和已经实现的各个子类的逻辑;
2. 工厂方法模式

猜你喜欢

转载自blog.csdn.net/qq_43614498/article/details/106169627