zoukankan      html  css  js  c++  java
  • Observer pattern

    定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够相应的发生变化.

    那华尔街的例子举个例子:

    投资者关注股票,但他没有必要整天在证交所目不转睛的关注股票的涨落,而是应该如果股票有变化,告诉投资者就可以了。

    do not call me, i will call you.

    public class IBMStock extends Stock {

    }

    public interface IInvestor {
    void Update( Stock stock );
    }
     
    public class ShanghaiInvestor implements IInvestor {
     
    private String name;
     
    public ShanghaiInvestor(String name) {
    super();
    this.name = name;
    }
     
    @Override
    public void Update(Stock stock) {
    DebugLog.log("the investor" + this.name + "stock has change"
    + stock.getName() + "the price is" + stock.getPrice());
    }
     
    }
     
     
    public abstract class Stock {
    protected String name;
    protected double price;
    private List<IInvestor> inVestors = new ArrayList<IInvestor>();
     
    public String getName() {
    return name;
    }
     
    public void setName(String name) {
    this.name = name;
    }
     
    public double getPrice() {
    return price;
    }
     
    public void setPrice(double price) {
    this.price = price;
    Notify();
    }
     
    public void attach(IInvestor investor) {
    inVestors.add(investor);
    }
     
    public void detach(IInvestor investor) {
    inVestors.remove(investor);
    }
     
    public void Notify()
    {
    int size = inVestors.size();
    for(int start=0;start<size;start++)
    {
    IInvestor investor=inVestors.get(start);
    investor.Update(this);
    }
    }
     
    }
     
     
    public class WallStreeInvestor implements IInvestor {
     
    private String name;
     
    public WallStreeInvestor(String name) {
    super();
    this.name = name;
    }
     
    @Override
    public void Update(Stock stock) {
    DebugLog.log("the investor" + this.name + "stock has change"
    + stock.getName() + "the price is" + stock.getPrice());
    }
     
    }
     
     
    public class Test {
     
    /**
    * @param args
    */
    public static void main(String[] args) {
    Stock aStock=new IBMStock();
    aStock.setName("IBM stock");
    IInvestor sInvestor=new ShanghaiInvestor("Shanghai");
    IInvestor wInvestor=new WallStreeInvestor("WallStreet");
    aStock.attach(sInvestor);
    aStock.attach(wInvestor);
    aStock.setPrice(1000);
    DebugLog.printLogSeperator();
    aStock.detach(wInvestor);
    aStock.setPrice(2000);
    DebugLog.printLogSeperator();
    aStock.detach(sInvestor);
    aStock.setPrice(5000);
    DebugLog.printLogSeperator();
    }
     
    }
     
    从代码中看出一个问题,Stock类中为什么要加入attach & detach方法啊,
    个人觉得应该加入一个manager 控制stock的添加和减少
     
    public class HPStock extends Stock {
     
    public HPStock(String name, double price) {
    super(name, price);
    }
     
    }
     
     
    public class IBMStock extends Stock {
     
    public IBMStock(String name, double price) {
    super(name, price);
    }
     
    }
     
     
    public interface IInvestor {
    void Update( Stock stock );
    }
     
     
    public interface IManager {
    public void attach(IInvestor investor);
    public void detach(IInvestor investor);
    public void Notify(Stock stock);
    }
     
     
    public class ShangHaiInvestor implements IInvestor {
     
    private String name;
     
    public ShangHaiInvestor(String name) {
    super();
    this.name = name;
    }
     
    @Override
    public void Update(Stock stock) {
    DebugLog.log("the investor" + this.name + "stock has change"
    + stock.getName() + "the price is" + stock.getPrice());
    }
     
    }
     
     
    public abstract class Stock {
    public Stock(String name, double price) {
    super();
    this.name = name;
    this.price = price;
    }
     
    protected String name;
    protected double price;
    protected IManager imanager;
    public IManager getImanager() {
    return imanager;
    }
     
    public void setImanager(IManager imanager) {
    this.imanager = imanager;
    }
     
    public String getName() {
    return name;
    }
     
    public void setName(String name) {
    this.name = name;
    }
     
    public double getPrice() {
    return price;
    }
     
    public void setPrice(double price) {
    this.price = price;
    imanager.Notify(this);
    }
     
    }
     
     
    public class StockManager implements IManager {
    private List<IInvestor> inVestors = new ArrayList<IInvestor>();
    public void attach(IInvestor investor) {
    inVestors.add(investor);
    }
     
    public void detach(IInvestor investor) {
    inVestors.remove(investor);
    }
     
    public void Notify(Stock stock)
    {
    int size = inVestors.size();
    for(int start=0;start<size;start++)
    {
    IInvestor investor=inVestors.get(start);
    investor.Update(stock);
    }
    }
    }
     
    public class WallStreeInvestor implements IInvestor {
     
    private String name;
     
    public WallStreeInvestor(String name) {
    super();
    this.name = name;
    }
     
    @Override
    public void Update(Stock stock) {
    DebugLog.log("the investor" + this.name + "stock has change"
    + stock.getName() + "the price is" + stock.getPrice());
    }
     
    }
     
     
    public class Test {
     
    /**
    * @param args
    */
    public static void main(String[] args) {
    Stock iStock=new IBMStock("IBM stock",1000);
    Stock hStock=new HPStock("HP stock",1000);
     
    IInvestor sInvestor=new ShangHaiInvestor("Shanghai");
    IInvestor wInvestor=new WallStreeInvestor("WallStreet");
    IManager iManager=new StockManager();
    iManager.attach(sInvestor);
    iManager.attach(wInvestor);
     
    iStock.setImanager(iManager);
    hStock.setImanager(iManager);
     
    iStock.setPrice(1000);
    iStock.setPrice(2000);
    iStock.setPrice(5000);
    hStock.setPrice(5000);
    }
     
    }
     
  • 相关阅读:
    python学习
    当时的月亮 王菲
    谈谈写程序与学英语(转载)
    excel 列索引(数字)转列名
    爆款PHP面试题
    关于PDO取得结果集的数据类型为string的问题
    分享几款常用的API/文档浏览器
    php写错命名空间 导致catch不到异常
    iOS图片上传后被旋转的问题
    vi写完文件保存时才发现是readonly😂
  • 原文地址:https://www.cnblogs.com/budoudou/p/2299862.html
Copyright © 2011-2022 走看看