观察者设计模式之Java实现
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)。
多个观察者对象同时监听某一个主题对象,当这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
EventSourceInterface.java(主题对象接口)
/**
* 事件源(被监听对象)
*
*/
public interface EventSourceInterface {
/**
* 注册监听器
* @param myListener
*/
public void registerListener(MyListenerInterface myListener);
/**
* 移除监听器
* @param myListener
*/
public void removeListener(MyListenerInterface myListener);
/**
* 触发监听器
*/
public void notifyAllListtener();
}
Sentry.java(主题对象实现类)
import java.util.ArrayList;
import java.util.List;
/**
* 事件源(事件发生的类)
*-------哨兵------
*/
public class Sentry implements EventSourceInterface{
private String name;
private String discription;
private List<MyListenerInterface> listeners;
public Sentry(String name,String discription) {
this.name=name;
this.discription=discription;
listeners=new ArrayList<>();
}
@Override
public void registerListener(MyListenerInterface myListener) {
listeners.add(myListener);
}
@Override
public void removeListener(MyListenerInterface myListener) {
listeners.remove(myListener);
}
@Override
public void notifyAllListtener() {
MyEvent event=new MyEvent(this);
event.setDescription("老师来了");
for (MyListenerInterface listener : listeners) {
listener.update(event);
}
}
@Override
public String toString() {
return "我是" + name +",我在帮"+listeners + discription;
}
public String getName() {
return name;
}
public String getDiscription() {
return discription;
}
}
MyListenerInterface .java(观察者接口)
/**
* 监听接口
*/
public interface MyListenerInterface {
/**
* 事件响应
* @param 事件类
*/
public abstract void update(MyEvent e);
}
Student .java(观察者实现类)
public class Student implements MyListenerInterface{
private String name;
private String discription;
public Student(String name,String discription){
this.name=name;
this.discription=discription;
}
@Override
public String toString() {
return "正在"+discription+"的"+name;
}
@Override
public void update(MyEvent e) {
Sentry eventSource=(Sentry) e.getEventSource();
System.out.println("我是"+name+
",我正在"+discription+","+eventSource.getDiscription()+"的"+eventSource.getName()
+"说"+e.getDescription());
}
}
MyEvent .java
/**
* 事件类:封装了事件的信息
*
*/
public class MyEvent {
private EventSourceInterface eventSource;
private String description;
public MyEvent(EventSourceInterface eventSource){
this.eventSource=eventSource;
}
public EventSourceInterface getEventSource(){
return eventSource;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
public class Client {
public static void main(String[] args) {
Sentry s=new Sentry("小明", "放哨");
Student s1=new Student("小刚", "抄作业");
Student s2=new Student("小强", "吃零食");
s.registerListener(s1);
s.registerListener(s2);
System.out.println(s);
System.out.println("-------------------");
//假设老师来了
s.notifyAllListtener();
}
}
----------
执行结果: