观察者模式

针对设计模式的讲解可以观看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再去通知对应的股民。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值