Andy Back-end Dev Engineer

JavaWeb-监听器相关设计模式


监听器相关设计模式

在 Servlet 规范中存在三大组件:Servlet 接口、Listener 接口、Filter 接口。我们在这里 要学习监听器接口 Listener。监听器是一种设计模式,是观察者设计模式的一种实现。所以 我们需要先学习观察者设计模式,再学习监听器设计模式。

观察者设计模式

从现实角度来说,我们每一个人都是一个观察者,同时也是一个被观察者。作为被观察 者,我们会发出一些信息,观察者在接收到这些信息后,会做出相应的反映;而作为观察者, 我们是可以被“被观察者”所发出的信息影响的。一个被观察者,可能存在多个观察者。也 就是说,一个被观察者所发出的信息,可能会影响到多个观察者。 观察者设计模式,定义了一种一对多的关联关系。一个对象 A 与多个对象 B、C、D 之 间建立“被观察与观察关系”。当对象 A 的状态发生改变时,通知所有观察者对象 B、C、D。 当观察者对象 B、C、D 在接收到 A 的通知后,根据自身实际情况,做出相应改变。 当然,观察者与被观察者指的都是具有某一类功能的对象,所以这里的观察者与被观察

代码实现:

// 定义观察者接口
public interface IObserver {
	// 处理被观察者发送来的信息
	void handleNotify(String message);
}

// 定义观察者两个实现类
public class FirstObserver implements IObserver{

	@Override
	public void handleNotify(String message) {
		// TODO Auto-generated method stub
		System.out.println("一号观察者接收到消息["+message+"], 正在处理消息....");
	}
}

public class SecondObserver implements IObserver{

	@Override
	public void handleNotify(String message) {
		// TODO Auto-generated method stub
		System.out.println("二号观察者接收到消息["+message+"], 正在处理消息....");
	}

}

// 定义被观察者接口
public interface IObserverable {
	// 添加观察者
	void addObserver(IObserver observer);
	// 删除观察者
	void removeObserver(IObserver observer);
	// 向观察者发送信息
	void notifyObservers(String message);
}

// 定义被观察者实现类
public class Some implements IObserverable {
	// 声明观察者集合
	private List<IObserver> observers;
	
	// 在被观察者对象创建时,将观察者集合创建
	public Some() {
		observers = new ArrayList<>();
	}
	

	@Override
	public void addObserver(IObserver observer) {
		observers.add(observer);
	}

	@Override
	public void removeObserver(IObserver observer) {
		observers.remove(observer);
	}

	@Override
	public void notifyObservers(String message) {
		// 通知每一个观察者
		for(IObserver observer : observers) {
			observer.handleNotify(message);
		}
	}
}

// 定义测试类
public class MyTest {
	public static void main(String[] args) {
		// 创建多个观察者
		IObserver firstObserver = new FirstObserver();
		IObserver secondObserver = new SecondObserver();
		
		// 创建被观察者
		Some some = new Some();
		
		// 被观察者添加观察者
		some.addObserver(firstObserver);
		some.addObserver(secondObserver);
		
		// 被观察者向所有观察者发送消息
		some.notifyObservers("hello world");
		
		// 被观察者删除一个观察者
		some.removeObserver(firstObserver);
		
		
		// 被观察再次向所有观察者发送消息
		System.out.println("------------------------");
		some.notifyObservers("hello world");
	}
}

监听器设计模式

监听器设计模式,是观察者设计模式的一种实现,它并不是 23 种设计模式之一。

这里的监听器实际对应的就是观察者,而被监听对象,则是指被观察者。当被监听对象的状态发生改变时,也需要通知监听器,监听器在收到通知后会做出相应改变。 与观察者设计模式不同点:

  1. 被监听者的状态改变,被定义为了一个对象,称为事件;
  2. 被监听对象有了个新的名子,称为事件源;
  3. 对监听器的通知,称为触发监听器。

其实质与观察者设计模式是相同的。

下面以对被监听者所执行的增删改查 CURD 操作进行监听为例,来演示监听器设计模式 的用法。

// 定义监听器接口
public interface IListener {
	// 处理事件
	void handle(ICurdEvent event);
}

// 定义监听器实现类
public class CrudLisntener implements IListener {

	@Override
	public void handle(ICurdEvent event) {
		String eventType = event.getEventType();
		if(ICurdEvent.CRE_EVENT.equals(eventType)) {
			System.out.println("事件源执行 添加 操作");
		} else if(ICurdEvent.DEL_EVENT.equals(eventType)) {
			System.out.println("事件源执行 删除 操作");
		} else if(ICurdEvent.UPD_EVENT.equals(eventType)) {
			System.out.println("事件源执行 更新 操作");
		} else if(ICurdEvent.RET_EVENT.equals(eventType)) {
			System.out.println("事件源执行 查询 操作");
		}
	}
}

// 定义事件接口
// 通常对于事件对象,我们需要从事件对象中获取到事件源对象的
public interface ICurdEvent {
	// 声明事件类型
	public static String CRE_EVENT = "create_event";
	public static String RET_EVENT = "retrive_event";
	public static String UPD_EVENT = "update_event";
	public static String DEL_EVENT = "delete_event";
	
	// 获取事件源对象
	public abstract IListenerable getEventSource();
	
	// 获取事件类型
	public abstract String getEventType();
}

// 定义事件实现类
public class CrudEvent implements ICurdEvent {
	private IListenerable eventSource;
	private String methodName;
	
	public CrudEvent(IListenerable eventSource, String methodName) {
		super();
		this.eventSource = eventSource;
		this.methodName = methodName;
	}

	@Override
	public IListenerable getEventSource() {
		return eventSource;
	}
	
	// 根据事件源执行的不同方法返回不同的事件类型
	@Override
	public String getEventType() {
		String eventType = null;
		if(methodName.startsWith("create")) {
			eventType = CRE_EVENT;
		} else if(methodName.startsWith("update")) {
			eventType = UPD_EVENT;
		} else if(methodName.startsWith("delete")) {
			eventType = DEL_EVENT;
		} else if(methodName.startsWith("find")) {
			eventType = RET_EVENT;
		} else {
			eventType = "not found";
		}
		
		return eventType;
	}
}

// 定义事件源接口
public interface IListenerable {
	// 为事件源注册监听器
	public abstract void setListener(IListener listener);
	
	// 触发监听器
	public abstract void triggerListener(ICurdEvent event);		
}

// 定义事件源实现类
public class Some implements IListenerable {
	private IListener listener;
	
	// 注册监听器
	@Override
	public void setListener(IListener listener) {
		this.listener = listener;
	}
	
	// 触发监听器
	@Override
	public void triggerListener(ICurdEvent event) {
		listener.handle(event);
	}
}

// 定义测试类
public class MyTest {
	public static void main(String[] args) {
		// 定义监听器
		IListener listener = new CrudLisntener();
		
		// 定义事件源
		IListenerable eventSource = new Some();
				
		// 定义事件对象
		ICurdEvent event = new CrudEvent(eventSource, "update table");
		
		// 事件源注册监听器
		eventSource.setListener(listener);
		
		// 事件源触发监听器
		eventSource.triggerListener(event);
	}
}

运行结果:
事件源执行 更新 操作


Comments

Content