观察者模式:秒杀启动案例(含Quartz的简单应用)
使用Quartz写一个简单的计时器,再使用观察者模式实现秒杀按钮启动的案例
题目
在某些重要的场景下,电商会开展定时秒杀活动,假设在6.18活动中携程网会对站内多种商品在同一时刻启动秒杀活动,请使用观察者模式,完成上述功能的设计类图和源码。
实现
在这个案例里,我没有写出相应的界面,所有的功能都是使用类模拟相对应的模块,重点在于观察者模式的使用上。先上类图。这里我用Quartz写了一个简单的计时器,通过Cron表达式对秒杀时间进行设置。当系统到达秒杀的时间时,秒杀按钮才开启秒杀。然后封装两个ConcreteButton的具体观察者类来模拟秒杀模块的功能。
上面的类图大致分为两个部分:其中的类QuartzSeckill主要与Client搭配实现计时器的功能,下面的5个类为观察者模式的实现,具体如下:
- Seckill:目标类(Subject),作为秒杀抽象目标类,其中的notifyseckill()为抽象通知方法;
- SeckillTime:具体目标类(ConcreteSubject),通过继承Seckill类,实现具体的通知方法;
- SeckillButton:观察者类(Observer):对Seckill类的改变做出反应,声明了更新数据的抽象方法response();
- ConcreteButton、ConcreteButtonall:具体观察者类(ConcreteObserver),两个类的功能相同,都是实现SeckillButton类中response()的具体方法,只是两个类的一些方法上存在差异。
以下是观察者模式的各个类,代码中含有解释的一些地方不再过多赘述:
Seckill.java:
import java.util.ArrayList;
/**
* 秒杀抽象目标类
*
*/
public abstract class Seckill {
//定义一个ArrayList,用来存放秒杀按钮
protected ArrayList<SeckillButton> buttons = new ArrayList<SeckillButton>();
//注册方法
public void attach(SeckillButton button){
buttons.add(button);
}
//注销方法
public void detach(SeckillButton button){
buttons.remove(button);
}
//抽象通知方法,通知更新所有的按键
public abstract void notifyseckill();
}
SeckillTime.java:
/**
* 具体目标类
*
*/
public class SeckillTime extends Seckill{
//秒杀是否开始状态标志
public boolean SeckillStart;
@Override
public void notifyseckill() {
System.out.println("618携程网的秒杀活动开始!");
System.out.println("------------------");
for(SeckillButton button:buttons){
button.response()