public interface Subject {
//注册一个observer
public void register(Observer observer);
//移除一个observer
public void remove(Observer observer);
//通知所有观察者
public void notifyObservers();
//获取主题类要发布的消息
public String getMessage();
}
ConcerteSubject:
public class MySubject implements Subject {
private List<Observer> observers;
private boolean changed;
private String message;
//对象锁, 用于同步更新观察者列表
private final Object mutex = new Object();
public MySubject() {
observers = new ArrayList<Observer>();
changed = false;
}
@Override
public void register(Observer observer) {
if (observer == null)
throw new NullPointerException();
//保证不重复
if (!observers.contains(observer))
observers.add(observer);
}
@Override
public void remove(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
// temp list
List<Observer> tempObservers = null;
synchronized (mutex) {
if (!changed)
return;
tempObservers = new ArrayList<>(this.observers);
this.changed = false;
}
for(Observer obj : tempObservers) {
obj.update();
}
}
//主题类发布新消息
public void makeChanged(String message) {
System.out.println("The Subject make a change: " + message);
this.message = message;
this.changed = true;
notifyObservers();
}
@Override
public String getMessage() {
return this.message;
}
}
public class SubjectManagement {
//一个记录 名字——主题类 的Map
private Map<String, Subject> subjectList = new HashMap<String, Subject>();
public void addSubject(String name, Subject subject) {
subjectList.put(name, subject);
}
public void addSubject(Subject subject) {
subjectList.put(subject.getClass().getName(), subject);
}
public Subject getSubject(String subjectName) {
return subjectList.get(subjectName);
}
public void removeSubject(String name, Subject subject) {
}
public void removeSubject(Subject subject) {
}
//singleton
private SubjectManagement() {}
public static SubjectManagement getInstance() {
return SubjectManagementInstance.instance;
}
private static class SubjectManagementInstance {
static final SubjectManagement instance = new SubjectManagement();
}
}
public interface Observer {
public void update();
public void setSubject(Subject subject);
}
ConcerteObserver:
public class MyObserver implements Observer {
private Subject subject;
// get the notify message from Concentrate Subject
@Override
public void update() {
String message = subject.getMessage();
System.out.println("From Subject " + subject.getClass().getName()
+ " message: " + message);
}
@Override
public void setSubject(Subject subject) {
this.subject = subject;
}
// subcirbe some Subject
public void subscribe(String subjectName) {
SubjectManagement.getInstance().getSubject(subjectName).register(this);
}
// cancel subcribe
public void cancelSubcribe(String subjectName) {
SubjectManagement.getInstance().getSubject(subjectName).remove(this);
}
}
public class ObserverTest {
private static MySubject writer;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
writer = new MySubject();
//添加一个名为Linus的作家
SubjectManagement.getInstance().addSubject("Linus",writer);
}
@Test
public void test() {
//定义几个读者
MyObserver reader1 = new MyObserver();
MyObserver reader2 = new MyObserver();
MyObserver reader3 = new MyObserver();
reader1.setSubject(writer);
reader2.setSubject(writer);
reader3.setSubject(writer);
reader1.subscribe("Linus");
reader2.subscribe("Linus");
reader3.subscribe("Linus");
writer.makeChanged("I have a new Changed");
reader1.update();
}
}
/**
* A tagging interface that all event listener interfaces must extend.
* @since JDK1.1
*/
public interface EventListener {
}
public class EventObject implements java.io.Serializable {
private static final long serialVersionUID = 5516075349620653480L;
/**
* The object on which the Event initially occurred.
*/
protected transient Object source;
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @exception IllegalArgumentException if source is null.
*/
public EventObject(Object source) {
if (source == null)
throw new IllegalArgumentException("null source");
this.source = source;
}
/**
* The object on which the Event initially occurred.
*
* @return The object on which the Event initially occurred.
*/
public Object getSource() {
return source;
}
/**
* Returns a String representation of this EventObject.
*
* @return A a String representation of this EventObject.
*/
public String toString() {
return getClass().getName() + "[source=" + source + "]";
}
}
public void setAttribute(String name, Object value) {
...
//上面的逻辑代码已省略
// 此处即通知监听者
notifyAttributeAssigned(name, value, oldValue);
}
private void notifyAttributeAssigned(String name, Object value,
Object oldValue) {
//从容器中获取webAPP中定义的Listener的实例对象
Object listeners[] = context.getApplicationEventListeners();
if ((listeners == null) || (listeners.length == 0)) {
return;
}
boolean replaced = (oldValue != null);
//创建相关事件对象
ServletRequestAttributeEvent event = null;
if (replaced) {
event = new ServletRequestAttributeEvent(
context.getServletContext(), getRequest(), name, oldValue);
} else {
event = new ServletRequestAttributeEvent(
context.getServletContext(), getRequest(), name, value);
}
//遍历所有监听器列表, 找到对应事件的监听器
for (int i = 0; i < listeners.length; i++) {
if (!(listeners[i] instanceof ServletRequestAttributeListener)) {
continue;
}
//调用监听器的方法, 实现监听操作
ServletRequestAttributeListener listener =
(ServletRequestAttributeListener) listeners[i];
try {
if (replaced) {
listener.attributeReplaced(event);
} else {
listener.attributeAdded(event);
}
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
context.getLogger().error(sm.getString("coyoteRequest.attributeEvent"), t);
// Error valve will pick this exception up and display it to user
attributes.put(RequestDispatcher.ERROR_EXCEPTION, t);
}
}
}
package observer;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
*描述:警察张三
*/
public class Police extends Observable {
private String time ;
public Police(List<Observer> list) {
super();
for (Observer o:list) {
addObserver(o);
}
}
public void change(String time){
this.time = time;
setChanged();
notifyObservers(this.time);
}
}
package observer;
import java.util.Observable;
import java.util.Observer;
/**
*描述:卧底A
*/
public class UndercoverA implements Observer {
private String time;
@Override
public void update(Observable o, Object arg) {
time = (String) arg;
System.out.println("卧底A接到消息,行动时间为:"+time);
}
}
package observer;
import java.util.Observable;
import java.util.Observer;
/**
*描述:卧底B
*/
public class UndercoverB implements Observer {
private String time;
@Override
public void update(Observable o, Object arg) {
time = (String) arg;
System.out.println("卧底B接到消息,行动时间为:"+time);
}
}
package observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observer;
/**
*描述:测试
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
UndercoverA o1 = new UndercoverA();
UndercoverB o2 = new UndercoverB();
List<Observer> list = new ArrayList<>();
list.add(o1);
list.add(o2);
Police subject = new Police(list);
subject.change("02:25");
System.out.println("===========由于消息败露,行动时间提前=========");
subject.change("01:05");
}
}
卧底B接到消息,行动时间为:02:25 卧底A接到消息,行动时间为:02:25 ===========由于消息败露,行动时间提前========= 卧底B接到消息,行动时间为:01:05 卧底A接到消息,行动时间为:01:05
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有