構(gòu)造了一個(gè)雙十一購(gòu)物的場(chǎng)景,重溫一下對(duì)觀察者模式的理解。
假如,我們有一個(gè)變量count,當(dāng)購(gòu)買一件商品時(shí),這個(gè)數(shù)字加1,退貨一件商品時(shí)這個(gè)數(shù)字減1。我們還有金幣和積分兩個(gè)業(yè)務(wù)模塊,這兩個(gè)模塊里的金幣和積分都和前面說(shuō)的變量相關(guān)。這就需要當(dāng)變量發(fā)生變化,能通知到我們的金幣業(yè)務(wù)模塊和積分業(yè)務(wù)模塊。我們的金幣模塊和積分模塊作為觀察者去觀察變量count(被觀察者), 當(dāng)購(gòu)買行為和退貨行為使變量count發(fā)生變化時(shí),就會(huì)遍歷去通知每一個(gè)監(jiān)聽(tīng)(觀察)了count的觀察者。
下面看看代碼:
//******************************觀察者接口*********************************//
package designPattern.observerMode;
public interface CountObserver {
void onChange(int count);
}
//*************************觀察者1:金幣業(yè)務(wù)類***********************//
package designPattern.observerMode;
//金幣相關(guān)的業(yè)務(wù)類
public class BusinessGold ?implements CountObserver{
private int goldNumber = 0;
public BusinessGold() {
}
@Override
public void onChange(int count) {
goldNumber = count;
System.out.println("金幣業(yè)務(wù)類收到通知:還剩下" + goldNumber + "個(gè)金幣");
}
}
//**********************觀察者2:積分業(yè)務(wù)*************************//
package designPattern.observerMode;
//積分相關(guān)的業(yè)務(wù)類
public class BusinessScore implements CountObserver {
private int scoreNumber = 0;
public BusinessScore() {
}
@Override
public void onChange(int count) {
scoreNumber = count;
System.out.println("積分業(yè)務(wù)類收到通知:您有" + scoreNumber + "個(gè)積分");
}
}
//*************************被觀察者****************************//
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);
}
}
}
//*****************************雙十一購(gòu)物活動(dòng)*************************//
package designPattern.observerMode;
//雙十一購(gòu)物狂歡
public class ShoppingActivity {
Counter counter;
public ShoppingActivity() {
}
/**
* 初始化監(jiān)聽(tīng)
*/
public void initActivity() {
counter = Counter.getInstance();
BusinessGold businessGold = new BusinessGold();
BusinessScore businessScore = new BusinessScore();
counter.register(businessGold);
counter.register(businessScore);
}
/**
* 購(gòu)買一件商品
*/
public void buy() {
System.out.println("我買了買1件商品。贈(zèng)送1個(gè)金幣和1個(gè)積分");
counter.add();
}
/**
* 退貨
*/
public void cancelOrder() {
System.out.println("我退了1件商品??廴?個(gè)金幣和1個(gè)積分");
counter.delete();
}
}
//*****************************調(diào)用入口*****************************//
package designPattern.observerMode;
public class Main {
public static void main(String[] args) {
ShoppingActivity activity = new ShoppingActivity();
activity.initActivity();
activity.buy();
activity.cancelOrder();
}
}
運(yùn)行結(jié)果:
我買了買1件商品。贈(zèng)送1個(gè)金幣和1個(gè)積分
金幣業(yè)務(wù)類收到通知:還剩下11個(gè)金幣
積分業(yè)務(wù)類收到通知:您有11個(gè)積分
我退了1件商品。扣去1個(gè)金幣和1個(gè)積分
金幣業(yè)務(wù)類收到通知:還剩下10個(gè)金幣
積分業(yè)務(wù)類收到通知:您有10個(gè)積分