/**
* 抽象一个观察者接口
*
* @author SunOlny
*
*/
public interface Observer {
public String send(String msg);
}
package design.pattern.observer;
/**
* 消息主题观察者
*
* @author SunOnly
*
*/
public class MsgObserver implements Observer {
private String name;
public MsgObserver(String name) {
this.name = name;
}
/*
* (non-Javadoc)
*
* @see design.pattern.observer.Observer#send(java.lang.String)
*/
@Override
public String send(String msg) {
return name + msg;
}
}
package design.pattern.observer;
import java.util.List;
/**
* 抽象一个主题接口
*
* @author SunOlny
*
*/
public interface Subject {
boolean addListener(Observer ob);
boolean removeListener(Observer ob);
boolean addListeners(List<Observer> list);
void watcher();
}
package design.pattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 实现一个消息主题类
*
* @author SunOlny
*
*/
public class MsgSubject implements Subject {
private List<Observer> list = new ArrayList<Observer>();
@Override
public boolean addListener(Observer ob) {
return list.add(ob);
}
@Override
public boolean removeListener(Observer ob) {
return list.remove(ob);
}
@Override
public boolean addListeners(List<Observer> list) {
return list.addAll(list);
}
@Override
public void watcher() {
for (Observer ob : list) {
System.out.println(ob.send("发送消息"));
}
}
}
package design.pattern.observer;
import org.junit.Test;
/**
* @author SunOlny
*
*/
public class TestObserver {
@Test
public void testMsgObject() {
Subject subject = new MsgSubject();
subject.addListener(new MsgObserver("我是订阅者1"));
subject.addListener(new MsgObserver("我是订阅者2"));
subject.addListener(new MsgObserver("我是订阅者3"));
subject.watcher();
}
}
测试结果
观察者模式一般解决消息发布/消息订阅,具体应用场景比如java中awt中各种事件使用的模式。