观察者模式:秒杀启动案例(含Quartz的简单应用)

观察者模式:秒杀启动案例(含Quartz的简单应用)

使用Quartz写一个简单的计时器,再使用观察者模式实现秒杀按钮启动的案例

题目

在某些重要的场景下,电商会开展定时秒杀活动,假设在6.18活动中携程网会对站内多种商品在同一时刻启动秒杀活动,请使用观察者模式,完成上述功能的设计类图和源码。
618携程秒杀按钮启动图

实现

在这个案例里,我没有写出相应的界面,所有的功能都是使用类模拟相对应的模块,重点在于观察者模式的使用上。先上类图。这里我用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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值