设计模式——观察者模式
观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。
对于观察者模式而言,肯定有观察者和被观察者之分。比如在一个目录下建立一个文件,这时系统会通知目录管理器增加目录,并通知磁盘减少空间,在这里,文件就是观察者,目录管理器和磁盘就是被观察者。
定义:观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
练习:当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
package observer_pattern; public interface Guancha { public void sheng(); public void jiang(); }
package observer_pattern; public class Gumin implements Guancha{ private String name; public Gumin(String a){name=a;} public void sheng(){ System.out.println(name+"买了一些股票(股票升了)"); } public void jiang(){ System.out.println("股票降价了,哭了"); } }
package observer_pattern; import java.util.ArrayList; public class Fen{ private ArrayList<Guancha> oblist; public Fen(){ oblist=new ArrayList<>(); } public void add(Guancha a){ oblist.add(a); } public void remove(Guancha a){ oblist.remove(a); } public void sheng(double a){ if(a>0.05) for(Guancha guan:oblist){ guan.sheng(); } } public void jiang(double a){ if(a>0.05) for(Guancha guan:oblist){ guan.jiang(); } } }
package observer_pattern; public class main { public static void main(String[] args) { Fen f=new Fen(); Gumin g1=new Gumin("第一个股民"); Gumin g2=new Gumin("第二个股民"); f.add(g1); f.add(g2); System.out.println("股票升了"); f.sheng(0.1); System.out.println("比率小于0.05"); System.out.println(); f.sheng(0.001); System.out.println("股票降了"); f.jiang(0.1); System.out.println("比率小于0.05"); System.out.println(); f.jiang(0.001); } }