观察者模式有四个对象:
(1) 事件源对象: 能发生事件的对象(一个或多个事件(事件集))
(2)事件对象:事件源发生事件的现场信息
(3)事件处理对象(接口): 委托给处理的对象
(4)观察者: 实现类/处理者
事件源必须包括:
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("带你去迪士尼");
}
}
}
-
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("带你去看天安门"); } } }
-
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("不高兴了"); } }
随笔一记!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96869.html