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