关闭

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

427人阅读 评论(0) 收藏 举报

类的四大基本关系: 

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;
			}
		}
	}

}

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:285182次
    • 积分:8481
    • 等级:
    • 排名:第2299名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:4条
    最新评论