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

java设计模式之观察者模式

2017-11-28 11:23 561 查看
java设计模式参考文章:

Java设计模式实战23种设计模式介绍以及在Java中的实现Java设计模式 Java经典设计模式之五大创建型模式

## 定义 ##

Observer模式是行为模式之一,
定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,
所有依赖它的对象都得到通知并被自动更新。


## 代码示例 ##

在博客里,有个订阅功能,当你订阅后,当博主发布新的博客,你都能收到消息。这是如何实现的? 是不是后台有个线程在不停的轮询?如果是这样的话,显然太耗资源,如果当博客在发布时,找到所有的订阅者, 然后循环的把消息发给订阅者,这样就会显得更人性化了。这就是观察者模式,观察者模式有两个对象:博主,订阅者。 当读者在订阅时,会把读者信息放到一个队列里面去,方便在博客主布时循环这个对列并发送消息。

/**
* @author bwx
* @date 2017/11/28
* 观察者抽象接口
*/
public interface Observers {
void update(String msg);
}

/**
* @author bwx
* @date 2017/11/28
* 博客观察者(订阅者)
*/
public class BlogObServer implements Observers {
public void update(String msg) {
System.out.println("观察者收到消息:" + msg);
}
}

/**
* @author bwx
* @date 2017/11/28
* 订阅者的注册中心或者主题抽象类
*/
public abstract class Subject {
protected List<Observers> observers = new LinkedList<Observers>();

public void attach(Observers observer) {
observers.add(observer);
}

public void detach(Observers observer) {
observers.remove(observer);
}

protected abstract void notifyObservers();
}

/**
* @author bwx
* @date 2017/11/28
* 订阅者的注册中心或者主题
*/
public class BlogSubject extends Subject {
protected void notifyObservers() {
for (Observers observer : observers) {
observer.update("已经发布博客");
}
}
}

public class Main {
public static void main(String[] args) {
BlogSubject blogSubject = new BlogSubject();
blogSubject.attach(new BlogObServer());
System.out.println("发布博客");
blogSubject.notifyObservers();
}
}


## 使用jdk实现观察者模式 ##

/**
* @author bwx
* @date 2017/11/28
* 博客对象
*/
public class Blog {
private String articleTitle;
private String articleContent;

public String getArticleTitle() {
return articleTitle;
}

public void setArticleTitle(String articleTitle) {
this.articleTitle = articleTitle;
}

public String getArticleContent() {
return articleContent;
}

public void setArticleContent(String articleContent) {
this.articleContent = articleContent;
}
}

/**
* @author bwx
* @date 2017/11/28
*/
public class BlogObServer implements Observer {
/**
* This method is called whenever the observed object is changed. An
* application calls an <tt>Observable</tt> object's
* <code>notifyObservers</code> method to have all the object's
* observers notified of the change.
*
* @param o   the observable object.
* @param arg an argument passed to the <code>notifyObservers</code>
*/
public void update(Observable o, Object arg) {
Blog blog = (Blog) arg;

System.out.println("观察者收到blog内容消息:" + blog.getArticleContent());
System.out.println("观察者收到blog标题消息:" + blog.getArticleTitle());
}
}

/**
* @author bwx
* @date 2017/11/28
* 订阅者的注册中心或者主题
*/
public class BlogSubject extends Observable {
public void publishBlog(String articleTitle,String articleContent) {
Blog blog = new Blog();
blog.setArticleTitle(articleTitle);
blog.setArticleContent(articleContent);
System.out.println("发布博客");
this.setChanged();
this.notifyObservers(blog);
}
}

/**
* @author bwx
* @date 2017/11/28
* 使用jdk实现观察者模式
*/
public class Main {
public static void main(String[] args) {
BlogSubject blogSubject = new BlogSubject();
blogSubject.addObserver(new BlogObServer());
blogSubject.publishBlog("blog标题", "blog内容");
}
}


## 解析 ##

拉模型,拉的方式就是主题的数据更新后,不直接将数据推给客户端,而是先推送一个通知并提供对应的方法供客户端拉取数据。

推模型 ,Subject主动向观察者推送有关状态的详细信息, 推送的信息通常是目标对象的全部或部分数据. 观察者只能被动接收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: