观察者模式简介

208 阅读3分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

观察者模式有四个对象:

(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("带你去迪士尼");
		}
	}
}

2. 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("带你去看天安门");
		}
	}
	}

3. 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("不高兴了");
			}
		}

随笔一记!