構造了一個雙十一購物的場景,重溫一下對觀察者模式的理解。
假如,我們有一個變量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個積分
金幣業務類收到通知:還剩下10個金幣
積分業務類收到通知:您有10個積分