观察者模式简介

观察者模式有四个对象:
(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("带你去看天安门");
     	}
     }
     }
    
  2. 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("不高兴了");
     		}
     	}
    

随笔一记!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值