观察者模式有四个对象:
(1) 事件源对象: 能发生事件的对象(一个或多个事件(事件集))
(2)事件对象:事件源发生事件的现场信息
(3)事件处理对象(接口): 委托给处理的对象
(4)观察者: 实现类/处理者
事件源必须包括:
1. 私有的监听者列表
2. 公有的向监听者列表添加监听者的方法
3. 做事情的方法(事件方法)

举个例子: 假如有一个很漂亮的女孩(事件源对象), 女孩子一般事比较多, 一会渴了, 一会饿了, 一会又不开心了等等(事件对象), 这时有很多男孩要追这个女孩, 那么他门就是(观察者/处理者/实现类), 因为你要追人家, 所有你必须无时无刻的观察这个女孩, 人家饿了, 你赶紧买份饭给她送去. 但这个女生也说了, 只有很帅的男孩才能追我, 不然怎么能匹配她的绝世容颜, 很帅就是这个事件处理对象(接口), 你必须满足这个要求去追人家才行, 否则人家都不搭理你! 这个女孩有个小本本(私有的监听者列表), 上面记录了所有符合她要求为她做事情的男孩(这件事情又因为害羞不想让其他人知道所有就是私有的), 你得让男生向你表白, 有符合条件的男生表白, 这个女孩就往自己的小本本写上它的名字, (公有的向监听者列表添加监听者的方法),女孩到底是渴了还是饿了还是不开心了(做事情的方法(事件方法))
观察者模式的本质是: 触发联动
优点:

  1. 观察者模式实现了观察者和目标之间的抽象耦合;
  2. 观察者模式实现了动态联动
  3. 观察者模式支持广播通信
    下面请看这个代码实现:(熟练了随便写,没顺序,初学者建议先写被调(被别人调的对象),在写主调)
    (1)GirlEvent(事件对象)
public class GirlEvent {
//只读,只有构造的时赋值,没set方法
	private String eventString = null;
	public GirlEvent() {
		// TODO Auto-generated constructor stub
	}
	public GirlEvent(String eventString) {
		this.eventString = eventString;
	}
	public String getEventString() {
		return eventString;
	}
}

(2)GirlListener(事件监听者接口)

public interface GirlListener {
//传GirlEvent 因为我们男生要根据女孩所发生的事件做事情,饿了送吃的,不开心了哄开心
	public void doSomething(GirlEvent e);
}

(3)Girl(事件源)

public class Girl {
//列表都是女孩认为可以追求她的男孩(接口:可以为她做事情)
	private List<GirlListener> list = new ArrayList<GirlListener>();
	
	public void addGrilListener(GirlListener listener) {
		this.list.add(listener);
	}
	
	public void GrilAction(String actionString) {
	//将她饿了不开心了首先封装成事件对象
		GirlEvent e = new GirlEvent(actionString);
		//此时,女孩说,让我看看我的小本本上的这几个人到底为不为我做事情
		for (GirlListener girlListener : list) {
			girlListener.doSomething(e);
		}
	}
}

(4)处理者
1. ABoy(美国男孩)要实现GirlListener ,也就是要满足女孩的要求

public class ABoy implements GirlListener {

	@Override
	public void doSomething(GirlEvent e) {
		if("饿了".equals(e.getEventString())) {
			System.out.println("送来了汉堡包!");
		} else if("不高兴了".equals(e.getEventString())) {
			System.out.println("带你去迪士尼");
		}
	}
}
  1. CBoy(中国男孩)要实现GirlListener ,也就是要满足女孩的要求
    public class CBoy implements GirlListener {
@Override
 public void doSomething(GirlEvent e) {
 	if("饿了".equals(e.getEventString())) {
 		System.out.println("送来了三秦套餐!");
 	} else if("不高兴了".equals(e.getEventString())) {
 		System.out.println("带你去看天安门");
 	}
 }
 }
  1. KBoy(韩国男孩)要实现GirlListener ,也就是要满足女孩的要求
    public class KBoy implements GirlListener {
@Override
 public void doSomething(GirlEvent e) {
 	if("饿了".equals(e.getEventString())) {
 		System.out.println("送来了泡菜!");
 	} else if("不高兴了".equals(e.getEventString())) {
 		System.out.println("带你去看星星");
 	}
 }

}
(5)运行类(测试类)
Run类:

public class Run {
 		public static void main(String[] args) {
 			//事件源实例
 			Girl wt = new Girl();
 			//监听者接口实现类的实例
 			CBoy xc = new CBoy();
 			KBoy jxx = new KBoy();
 			ABoy stl = new ABoy();
 			//让事件源添加监听者接口实现类的实例
 			wt.addGrilListener(xc);
 			wt.addGrilListener(jxx);
 			wt.addGrilListener(stl);
 			//女孩锁事来了
 			wt.GrilAction("饿了");
 			wt.GrilAction("不高兴了");
 		}
 	}

随笔一记!