您的位置:首页 > 编程语言 > Java开发

观察者模式的java代码示例

2018-01-26 15:17 253 查看
第一步:先创建一个被观察者接口;

/**
* <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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: