• 解析Observer 模式


    Observer模式主要通过observer的注册,当subject有什么变化时通过注册的observer,但是经典的设计中将add detach放在subject中,个人

    觉得不是很好,因为注册和解绑和并不是和subject相关的行为,最好通过一个delegate将其放在一个class中来处理,因为找不到一个很好的例子

    ,找到某人以前的例子改写了一下。再次表示感谢。

    public class HPStock extends Stock {


    public HPStock(String price, InvestorHandler handler) {
    super(price, handler);
    // TODO Auto-generated constructor stub
    }

    @Override
    protected void update() {
    System.out.println(
    "hp current price is"+price);
    setChanged();
    }

    }
    public class IbmStock extends Stock {
    
    	public IbmStock(String price, InvestorHandler handler) {
    		super(price, handler);
    	}
    
    	@Override
    	protected void update() {
    		System.out.println("ibm stock current price is"+price);
    		setChanged();
    	}
    
    }
    
    public interface IInvestor {
        void update(String price);
    }
    
    public class InvestorHandler {
    	private String price;
    	
    	public InvestorHandler(String price) {
    		super();
    		this.price = price;
    	}
    
    	private List<IInvestor> listInvestor = new ArrayList<IInvestor>();
    	public void addInvestor(IInvestor aInvestor) {
    		listInvestor.add(aInvestor);
    	}
    
    	public void removeInvestor(IInvestor aInvestor) {
    		listInvestor.remove(aInvestor);
    	}
    	
    	public void notifyObserver() {
    		for (int index = 0; index < listInvestor.size(); index++) {
    			IInvestor investor = listInvestor.get(index);
    			investor.update(price);
    		}
    	}
    }
    
    public class Main {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		InvestorHandler handler = new InvestorHandler("90");
    		Stock mstock = new IbmStock("90", handler);
    
    		mstock.addInvestor(new WallSteetInvestor());
    		mstock.addInvestor(new WallSteetInvestor());
    		mstock.addInvestor(new ShanghaiInvestor());
    		mstock.addInvestor(new ShanghaiInvestor());
    		mstock.update();
    
    		InvestorHandler handler1 = new InvestorHandler("30");
    		Stock hpStock = new HPStock("30", handler1);
    		hpStock.addInvestor(new WallSteetInvestor());
    		hpStock.addInvestor(new WallSteetInvestor());
    		hpStock.addInvestor(new ShanghaiInvestor());
    		hpStock.addInvestor(new ShanghaiInvestor());
    		hpStock.update();
    
    	}
    
    }
    
    public class ShanghaiInvestor implements IInvestor {
    
    	@Override
    	public void update(String price) {
    	  System.out.println("Shanghai investor current price is"+price);
    	}
    
    }
    
    public abstract class Stock {
    
    	protected String price;
    	private InvestorHandler handler;
    
    	public Stock(String price, InvestorHandler handler) {
    		super();
    		this.price = price;
    		this.handler = handler;
    	}
    
    	protected abstract void update();
    	public void addInvestor(IInvestor aInvestor) {
    		handler.addInvestor(aInvestor);
    	}
    
    	public void removeInvestor(IInvestor aInvestor) {
    		handler.removeInvestor(aInvestor);
    	}
    
    	protected void setChanged() {
    		handler.notifyObserver();
    	}
    	
    }
    
    public class WallSteetInvestor implements IInvestor {
    
    	@Override
    	public void update(String price) {
    	  System.out.println("wall steet current price is"+price);
    	}
    
    }
    
  • 相关阅读:
    Android中Activity和Fragment之间的通信
    用Android布局和简单控件实现的一个常见的界面
    【Linux】linux常用基本命令 [轉載]
    本地项目上传到gitlab
    spring boot 配置redis
    linux mysql的安装
    linux 安装 java环境变量
    mvc 跨域
    JSON 的几种简单格式和转换
    地区三级联动和全盘扫描索引的建立
  • 原文地址:https://www.cnblogs.com/budoudou/p/2100979.html
Copyright © 2020-2023  润新知