第一步:先创建一个被观察者接口;
/**
* <pre>
* 被观察者
* </pre>
*/
public interface MyObserverable {
void register(MyObserver myObserver);
void remove(MyObserver myObserver);
void send(NewsModel newsModel);
}
第二步:创建一个观察者接口;
/**
* <pre>
* 观察者
* </pre>
*/
public interface MyObserver {
void receive(NewsModel newsModel);
}
第三步:
/**
* <pre>
* 具体被观察者,实现了被观察者接口,每隔2s发送一次消息
* </pre>
*/
public class NewsProvider implements MyObserverable {
private static final long DELAY = 2*1000;
private List<MyObserver> myObservers;
public NewsProvider() {
myObservers = new ArrayList<MyObserver>();
generateNews();
}
/**
* 模拟产生新闻,每2s发送一次
*/
private void generateNews() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
int titleCount = 1;
int contentCount = 1;
@Override
public void run() {
send(new NewsModel("title:" + titleCount++, "content:" + contentCount++));
}
}, DELAY, 1000);
}
@Override
public void register(MyObserver myObserver) {
if (myObserver == null) {
return;
}
synchronized (this) {
if (!myObservers.contains(myObserver)) {
myObservers.add(myObserver);
}
}
}
@Override
public synchronized void remove(MyObserver myObserver) {
myObservers.remove(myObserver);
}
@Override
public void send(NewsModel newsModel) {
for (MyObserver observer : myObservers) {
observer.receive(newsModel);
}
}
}
第四步:具体观察者
/**
* <pre>
* 观察者的实现类
* </pre>
*/
public class User implements MyObserver {
private String mName;
public User(String mName) {
this.mName = mName;
}
@Override
public void receive(NewsModel newsModel) {
System.out.println(mName + " receive news:" + newsModel.getTitle() + " " + newsModel.getContent());
}
}
第五步:创建实体类
public class NewsModel {
private String title;
private String content;
public NewsModel() {
}
public NewsModel(String title, String content) {
this.title = title;
this.content = content;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "NewsModel [title=" + title + ", content=" + content + "]";
}
}
第六步:测试
public static void main(String[] args) {
MyObserverable newsProvider = new NewsProvider();
MyObserver user;
for (int i = 0; i < 3; i++) {
user = new User("user:" + i);
newsProvider.register(user);
}
}