监听器设计模式(观察者模式、订阅发布模式)

类的四大基本关系: 

a.关联关系:如A类调用B类。 

b.继承关系:如A类是B类的父类。 

c.聚合关系:如装橘子的箱子,箱子是否存在与里面装没装橘子没有任何关系,也就是说橘子不会影响箱子的存在。 

d.组合关系:如一个小组,小组是否存在与小组中是否有组员是息息相关的,如果没有组员,小组就不存在了。

 

监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法

 

观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数

 

1、定义监听器

public interface Listener {

	public void action();
	
}

 

public class ClickListener implements Listener {

	@Override
	public void action() {
		System.out.println("ClickListener action!");
	}

}

 

public class DoubleClickListener implements Listener {

	@Override
	public void action() {
		System.out.println("DoubleClickListener action!");
	}

}

 

2、定义事件

public interface Event {
	int getType();
}

 

public class ClickEvent implements Event {

	@Override
	public int getType() {
		return 1;
	}

}

 

public class DoubleClickEvent implements Event {

	@Override
	public int getType() {
		return 2;
	}

}

 

3、定义绑定事件的对象

public class Client {

	Listener listener;
	Event event;

	public static void main(String[] args) {
		// 1、假定client是数据源
		Client client = new Client();

		// 2、给数据源绑定事件监听
		Listener listener = new DoubleClickListener();
		client.addListener(listener);

		// 3、触发“双击”事件
		DoubleClickEvent dce = new DoubleClickEvent();
		client.addEvent(dce);
		// 4、触发“单击”事件
		ClickEvent ce = new ClickEvent();
		client.addEvent(ce);
	}

	public void addListener(Listener listener) {
		this.listener = listener;
	}

	public void addEvent(Event event) {
		//首先必须要存在添加了监听,如果没有监听就没有任何动作
		if (this.listener != null) {
			this.event = event;

			int eventType = event.getType();
			switch (eventType) {
			case 1:
				if (this.listener.getClass() == ClickListener.class) {
					this.listener.action();
				} else {
					System.err.println("没有绑定单击事件");
				}
				break;
			case 2:
				if (this.listener.getClass() == DoubleClickListener.class) {
					this.listener.action();
				} else {
					System.err.println("没有绑定双击事件");
				}
				break;
			default:
				break;
			}
		}
	}

}

 

阅读更多
上一篇JNDI入门学习
下一篇Jboss无法通过IP地址访问,只能用localhost\127.0.0.1访问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭