针对设计模式的讲解可以观看https://blog.youkuaiyun.com/LoveLion/article/details/17517213
练习
Sunny软件公司欲开发一款实时在线股票软件,该软件需提供如下功能:
当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发
送通知(包括新价格)给购买该股票的所有股民。试使用观察者模式设
计并实现该系统。
本文是对文中的练习的一个个人解法:
有三个类,中心`Center`,`ConcreteStock`,`Stock`,`stockholder`。其中stock是事件,ConcreteStock是被观察目标,stockholder是观察者,Center是管理被观察目标的中心。下面是代码部分:
- Center
package com.xxczjl.study.Observer.exercise;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Center {
private int Number;
public int getNumber() {
return 0;
}
protected static final Map<Center,List<AbsObserver>> centerObservers=new HashMap<>();
public Center(){
}
public void notifyAll(Stock stock){
for(Map.Entry<Center,List<AbsObserver>> e:centerObservers.entrySet()){
if(e.getKey().getNumber()==stock.getNumber()){
List<AbsObserver> stockholders = e.getValue();
for (AbsObserver observer:stockholders){
observer.operator();
}
break;
}
}
}
}
- ConcreteStock
package com.xxczjl.study.Observer.exercise;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.Observable;
public class ConcreteStock001 extends Center {
private int Number;
public ConcreteStock001(){
Number=1;
}
public int getNumber(){
return Number;
}
public void register(){
Center.centerObservers.put(this,new ArrayList<AbsObserver>());
}
public void addObs(AbsObserver observer){
Center.centerObservers.get(this).add(observer);
}
}
public class ConcreteStock002 extends Center {
private int Number;
public ConcreteStock002(){
Number=2;
}
public int getNumber(){
return Number;
}
public void register(){
Center.centerObservers.put(this,new ArrayList<AbsObserver>());
}
public void addObs(AbsObserver observer){
Center.centerObservers.get(this).add(observer);
}
}
- AbsObserver和stockholder
package com.xxczjl.study.Observer.exercise;
public abstract class AbsObserver {
public abstract void operator();
}
public class stockholder001 extends AbsObserver{
@Override
public void operator() {
System.out.println("001股票动了");
}
}
public class stockholder002 extends AbsObserver{
@Override
public void operator() {
System.out.println("002股票动了");
}
}
- Stock
package com.xxczjl.study.Observer.exercise;
public class Stock {
private int Number;
public Stock(int num){
Number=num;
}
public int getNumber(){
return Number;
}
}
- Main函数
package com.xxczjl.study.Observer.exercise;
public class Main {
public static void main(String[] args) {
//若干股民,股民关注不同的股票。
stockholder001 stockholder001 = new stockholder001();
stockholder002 stockholder002 = new stockholder002();
//股票2被观察目标加入中心
ConcreteStock002 concreteStock002 = new ConcreteStock002();
concreteStock002.register();
concreteStock002.addObs(stockholder002);
//股票1被观察目标加入中心
ConcreteStock001 concreteStock001 = new ConcreteStock001();
concreteStock001.register();
concreteStock001.addObs(stockholder001);
//股票1发生变动
Stock stock = new Stock(2);
new Center().notifyAll(stock);
}
}
- 后期改进:可以利用center去管控不同的ConcreteStock,股民的注册直接通过center实现,center根据股民关注的股票信息去通知不同的ConcreteStock去添加股民。当股票发生变动时,通过center去通知对应的ConcreteStock,然后对应的ConcreteStock再去通知对应的股民。