场景:在你自己的网址,对于新用户和老用户,购买商品后奖励机制不同,所以就需要策略模式来扩展不同的逻辑
package designpatterns.strategy;
/**
* 抽象工厂
*/
public abstract class StrategyFactory<T> {
/**
* 创建策略
* @return
*/
abstract RewardStrategy createStrategy(Class<T> c);
}
package designpatterns.strategy;
/**
* 具体工厂,创建具体的策略
*/
public class FactorRewardStrategyFactory extends StrategyFactory {
@Override
RewardStrategy createStrategy(Class c) {
RewardStrategy strategy = null;
try {
strategy = (RewardStrategy) Class.forName(c.getName()).newInstance();
} catch (Exception ignored) {}
return strategy;
}
}
package designpatterns.strategy;
/**
* 抽象返奖策略
*/
public abstract class RewardStrategy {
public abstract int reward(Long userId);
public abstract void insertRewardAndSettlement(Long userId,int reward);
}
package designpatterns.strategy;
/**
* 执行策略
*/
public class RewardContext {
private RewardStrategy rewardStrategy;
public RewardContext(RewardStrategy rewardStrategy) {
this.rewardStrategy = rewardStrategy;
}
public void doStrategy(Long userId) {
int reward = rewardStrategy.reward(userId);
rewardStrategy.insertRewardAndSettlement(userId,reward);
}
}
/**
* 新用户返奖策略
*/
public class NewUserRewardStrategy extends RewardStrategy {
/**
* 具体的策略逻辑
* @param userId
*/
@Override
public int reward(Long userId) {
return 100;
}
@Override
public void insertRewardAndSettlement(Long userId, int reward) {
}
}
package designpatterns.strategy;
public class OldUserRewardStrategy extends RewardStrategy{
@Override
public int reward(Long userId) {
return 80;
}
@Override
public void insertRewardAndSettlement(Long userId, int reward) {
}
}
测试代码
package designpatterns.strategy;
public class executeStrategy {
public static void main(String[] args) {
FactorRewardStrategyFactory factory = new FactorRewardStrategyFactory();
RewardStrategy strategy = factory.createStrategy(NewUserRewardStrategy.class);
RewardContext rewardContext = new RewardContext(strategy);
rewardContext.doStrategy(1L);
}
}