观察者模式设计到的角色至少有 观察者和被观察者
使用情景:当一个对象做出一个动作的时候,另一个(另一些)对象会做出响应的动作
最经典的莫过于: 猫叫的时候 老鼠就会跑(这个时候老鼠就是观察者 他一观察猫叫就跑)
我就以猫和老鼠为例子来分析一下自己对java观察者模式的理解!
1.老鼠接口------观察者模式中观察者接口
package 观察者模式;
public interface Listening {
public void run();
}
public class baishu{
public void run(){
System.out.println("mimi,白鼠run");
}
}
4,猫----被观察者(这里也可以进行一层接口进行封装,具体情况而定,不过现在一般情况下是不需要的)
package 观察者模式;
public class Cat {
public void mimi(){
System.out.println("cat mimi");
//manage可以配置在Spring中
EventManage manage = EventManage.getInstance();
//具体的添加监听器不加载这里,而是在具体的鼠上面。因为鼠加不加具有自己的选择性
manage.triggerEvent();
}
}
package 观察者模式;
import java.util.ArrayList;
import java.util.List;
public class EventManage {
private static EventManage manage = new EventManage();
private EventManage(){
}
public static EventManage getInstance(){
//我的原意是:在Spring加载bean的时候就加载这两个类
//这样就能加载这个类的static块从而加载具体的监听器
new Baishu();
return manage;
}
private List<Listening> listenings = new ArrayList<Listening>();
public void addListening(Listening l){
if(null == listenings || listenings.isEmpty()){
listenings = new ArrayList<Listening>();
}
listenings.add(l);
}
public void removeListening(Listening l){
if(null == listenings || listenings.isEmpty()){
System.out.println("没有配置监听器");
}
listenings.remove(l);
}
public void triggerEvent(){
if(null == listenings || listenings.isEmpty()){
listenings = new ArrayList<Listening>();
}
for(Listening l : listenings){
l.run();
}
}
}
package 观察者模式;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Cat cat = new Cat();
cat.mimi();
}
}