观察者模式和监听模式完成的都是一样的工作就是通知的作用。我们现在试想一个案例,一个士兵在发现敌人之后需要报告长官。好的我们现在来着手写
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;
}
}
我们可以发现 使用监听之后我们就可以分离观察者和被观察者了