观察者模式之双十一购物

构造了一个双十一购物的场景,重温一下对观察者模式的理解。

假如,我们有一个变量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个积分


猜你喜欢

转载自blog.csdn.net/nnmmbb/article/details/78731935