完成任务:紫钻官网挖宝藏页面买道具送一次抽奖,主要逻辑:抽奖逻辑及支付逻辑,奖品的发放逻辑:父类BaseProcessor里有一个PresentReleaseService,PresentReleaseService里有个map,每当一个子类Processor初始化时(Spring自动扫描),就往PresentReleaseService里的map里放自己(和奖品类型对应),这样PresentReleaseService只有一个,map也只有一个,发放的时候根据奖品类型从map里拿Processor,每个子类Processor重写getProcessorType()方法和release()方法
public abstract class BaseProcessor implements ReleaseProcessor {
@Autowired
protected PresentReleaseService presentReleaseService;
@PostConstruct
public void registerProcesser() {
presentReleaseService.register(getProcessorType(),this);
}
abstract protected int getProcessorType();
}
public class PresentReleaseServiceImpl implements PresentReleaseService {
private Map<Integer, ReleaseProcessor> releaseProcessors = new HashMap<Integer, ReleaseProcessor>();
@Override
public void register(Integer type, ReleaseProcessor releaseProcessor) {
ReleaseProcessor previousReleaseProcessor = releaseProcessors.put(type, releaseProcessor);
if (previousReleaseProcessor != null) {
throw new RuntimeException("注册器检测到相同的奖品发放逻辑,请保证发放逻辑的唯一性。冲突的奖品类型为:" + type);
}
}
}
// 发放逻辑
ReleaseProcessor releaseProcesser = releaseProcessors.get(present.getType());
if (releaseProcesser != null) {
result = releaseProcesser.release(uid, present, remark);
}
下单验证器Validator逻辑也是这样