观察者模式和监听模式

来源:互联网 发布:淘宝怎么修改好评评价 编辑:程序博客网 时间:2024/06/06 00:55

观察者模式和监听模式完成的都是一样的工作就是通知的作用。我们现在试想一个案例,一个士兵在发现敌人之后需要报告长官。好的我们现在来着手写

Pawn 类

package test;import java.util.ArrayList;import java.util.List;public class Pawn {     private List<Leader> leaders=new ArrayList<>();     public void attach(Leader l){        leaders.add(l);     }     public void detach(Leader l){         leaders.remove(l);     }     public void standGuard( ){         System.out.println("Pawn: find enemies ,I wanna report Sir");        if(true/*find enemies*/){            for(Leader leader:leaders){                leader.order( "find enemies");              }        }    }     public static void main(String args[]){         Pawn p=new Pawn();         p.attach(new Captain());         p.standGuard();     }}

Leader 类

package test;public interface Leader {    public void order(String string);}

Captain类

package test;public class Captain implements Leader {    @Override    public void order(String msg) {        // TODO Auto-generated method stub        System.out.println("Captain:recevie a message:"+msg);    }}

上面的源码就是观察者模式的简单实现。可以看见其实很简单。就是让一个类在触发某件事的时候去调用另一个类的方法

而监听模式就是在观察者和被观察者之间建立一座桥梁
leader和Caption类没有变
Pawn 类

package listener;import java.util.ArrayList;import java.util.List;public class Pawn {     private List<Leader> leaders=new ArrayList<>();     private List<Listener> listeners=new ArrayList<>();     public  Pawn(){         attach(new Captain());         addListener(new Listener(){                @Override                public void handleEvent(EventString es) {                    // TODO Auto-generated method stub                    for(Leader leader:leaders){                        leader.order(es.getMsg());                      }                }             });     }     public void attach(Leader l){            leaders.add(l);    }    public void detach(Leader l){             leaders.remove(l);    }     public void addListener(Listener l){         listeners.add(l);     }     public void removeListener(Listener l){         listeners.remove(l);     }     public void standGuard( ){         System.out.println("Pawn: find enemies ,I wanna report Sir");        if(true/*find enemies*/){            EventString e=new EventString("find enemies: type =footman");            for(Listener l:listeners){                l.handleEvent(e);            }        }    }     public static void main(String args[]){         Pawn p=new Pawn();         p.standGuard();     }}

listener类

package listener;public interface Listener {    public void  handleEvent(EventString e);}

EventString类

package listener;public class EventString  {    private String msg;    public EventString(String msg) {        super();        this.msg = msg;    }    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }}

我们可以发现 使用监听之后我们就可以分离观察者和被观察者了

原创粉丝点击