构造了一个双十一购物的场景,重温一下对观察者模式的理解。
假如,我们有一个变量count,当购买一件商品时,这个数字加1,退货一件商品时这个数字减1。我们还有金币和积分两个业务模块,这两个模块里的金币和积分都和前面说的变量相关。这就需要当变量发生变化,能通知到我们的金币业务模块和积分业务模块。我们的金币模块和积分模块作为观察者去观察变量count(被观察者), 当购买行为和退货行为使变量count发生变化时,就会遍历去通知每一个监听(观察)了count的观察者。
下面看看代码:
//******************************观察者接口*********************************//
package designPattern.observerMode;
public interface CountObserver {
void onChange(int count);
}
//*************************观察者1:金币业务类***********************//
package designPattern.observerMode;
//金币相关的业务类
public class BusinessGold implements CountObserver{
private int goldNumber = 0;
public BusinessGold() {
}
@Override
public void onChange(int count) {
goldNumber = count;
System.out.println("金币业务类收到通知:还剩下" + goldNumber + "个金币");
}
}
//**********************观察者2:积分业务*************************//
package designPattern.observerMode;
//积分相关的业务类
public class BusinessScore implements CountObserver {
private int scoreNumber = 0;
public BusinessScore() {
}
@Override
public void onChange(int count) {
scoreNumber = count;
System.out.println("积分业务类收到通知:您有" + scoreNumber + "个积分");
}
}
//*************************被观察者****************************//
package designPattern.observerMode;
import java.util.ArrayList;
//被观察者
public class Counter {
int count = 10;
static Counter counter = null;
ArrayList observerList = new ArrayList();
private Counter() {
}
public static Counter getInstance() {
if (counter == null)
counter = new Counter();
return counter;
}
public void add() {
count++;
notifyObservers();
}
public void delete() {
count--;
notifyObservers();
}
public void register(CountObserver observer) {
observerList.add(observer);
}
public void unRegister(CountObserver observer) {
observerList.remove(observer);
}
private void notifyObservers() {
for (CountObserver observer : observerList) {
observer.onChange(count);
}
}
}
//*****************************双十一购物活动*************************//
package designPattern.observerMode;
//双十一购物狂欢
public class ShoppingActivity {
Counter counter;
public ShoppingActivity() {
}
/**
* 初始化监听
*/
public void initActivity() {
counter = Counter.getInstance();
BusinessGold businessGold = new BusinessGold();
BusinessScore businessScore = new BusinessScore();
counter.register(businessGold);
counter.register(businessScore);
}
/**
* 购买一件商品
*/
public void buy() {
System.out.println("我买了买1件商品。赠送1个金币和1个积分");
counter.add();
}
/**
* 退货
*/
public void cancelOrder() {
System.out.println("我退了1件商品。扣去1个金币和1个积分");
counter.delete();
}
}
//*****************************调用入口*****************************//
package designPattern.observerMode;
public class Main {
public static void main(String[] args) {
ShoppingActivity activity = new ShoppingActivity();
activity.initActivity();
activity.buy();
activity.cancelOrder();
}
}
运行结果:
我买了买1件商品。赠送1个金币和1个积分
金币业务类收到通知:还剩下11个金币
积分业务类收到通知:您有11个积分
我退了1件商品。扣去1个金币和1个积分
金币业务类收到通知:还剩下10个金币
积分业务类收到通知:您有10个积分