如果猫一叫,老鼠就跑,你会用什么模式。这里可以用观察者模式。
1 public interface ICat 2 { 3 public void addObserver(IMouse m); 4 5 public void removeObserver(IMouse m); 6 7 public void notifyObserver(); 8 9 public void shout(); 10 }
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class HelloKitty implements ICat 5 { 6 private List<IMouse> observers = new ArrayList<IMouse>(); 7 8 public void addObserver(IMouse m) 9 { 10 observers.add(m); 11 } 12 13 public void removeObserver(IMouse m) 14 { 15 observers.remove(m); 16 } 17 18 public void shout() 19 { 20 System.out.println("Cat is shouting!"); 21 notifyObserver(); 22 } 23 24 public void notifyObserver() 25 { 26 for (IMouse m : observers) 27 { 28 m.run(); 29 } 30 } 31 }
1 public interface IMouse 2 { 3 public void run(); 4 }
1 public class MickeyMouse implements IMouse 2 { 3 public void run() 4 { 5 System.out.println("Kitty is coming, Let's horror run! "); 6 } 7 }
1 public class Test 2 { 3 public static void main(String args[]) 4 { 5 ICat cat = new HelloKitty(); 6 IMouse mouse = new MickeyMouse(); 7 cat.addObserver(mouse); 8 cat.shout(); 9 } 10 }
如果要自己实现,代码可以简单的像上面这样写。
运行结果:
----------------------------------
Cat is shouting
Kitty is coming, Let's horror run!
但是Java给我们提供了Observer接口/ Observable实现类。
Observer接口里面就一个update方法。因为它是观察者,所以他只要接到通知道后,do biz就可以了,所以很简单。
Observable是个实现类,它做的事比较多,比如添加观察者,移去观察者,所以肯定要一个观察者集合,还有就是本身只否发生的change的成员变量设置,最主要的就是通知观察者这个方法了,具体可以自己看原码了。
下面看用Java给我们提供的方法再实现上面的业务,就更简单了。
1 import java.util.Observable; 2 3 public class HelloKitty extends Observable 4 { 5 public void shout() 6 { 7 System.out.println("Cat is shouting"); 8 super.setChanged(); 9 super.notifyObservers(); 10 } 11 }
1 import java.util.Observable; 2 import java.util.Observer; 3 4 public class MickeyMouse implements Observer 5 { 6 public MickeyMouse(Observable o) 7 { 8 o.addObserver(this); 9 } 10 11 public void update(Observable arg0, Object arg1) 12 { 13 System.out.println("Kitty is coming, Let's horror run!"); 14 } 15 }
1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 HelloKitty cat = new HelloKitty(); 6 MickeyMouse mouse = new MickeyMouse(cat); 7 cat.shout(); 8 } 9 }
运行结果和上面是一样的, 是不是方便很多。
还有像很多电子商务网站,在某个商品上会有,降价通知我的按钮,你觉得那是干什么的呢? 它也可用观察者模式实现哦。自己试试吧。