设计模式笔记 – Observer 观察者模式 (Design Pattern)
本文由发表于6年前 | J2EE | 暂无评论 |  被围观 6,103 views+
1、观察者模式(Observer):2、观察者模式的结构图:3、观察者模式涉及到的角色:4、实现代码如下:5、其他说明:
1、观察者模式(Observer):

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

2、观察者模式的结构图:

3、观察者模式涉及到的角色:

抽象主题角色:(Subject)把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。

抽象观察者角色:(Watcher)为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

具体主题角色:(ConcreteSubject)在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

具体观察者角色:(ConcreteWatcher)实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类实现。

4、实现代码如下:

抽象主题角色,被观察者:

/**
 * 抽象主题角色
 * 被观察者
 */
public interface Subject {

    public void addWatcher(Watcher watcher);

    public void removeWatcher(Watcher watcher);

    public void notifyWatchers(String str);
}

抽象观察者角色:

/**
 * 抽象观察者角色
 */
public interface Watcher {

    public void update(String str);
}

具体主题角色:

/**
 * 具体主题角色
 */
public class ConcreteSubject implements Subject {

    private List<Watcher> list = new ArrayList<Watcher>();
    @Override
    public void addWatcher(Watcher watcher) {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher) {
        list.remove(watcher);
    }

    @Override
    public void notifyWatchers(String str) {
        for(Watcher watcher : list){
            watcher.update(str);
        }
    }
}

具体观察者角色:

/**
 * 具体观察者角色
 */
public class ConcreteWatcher implements Watcher {

    @Override
    public void update(String str) {
        System.out.println(str);
    }
}

在客户端使用观察者角色:

public static void main(String[] args) {
    //创建主题角色
    Subject watched = new ConcreteSubject();
    //创建观察者角色
    Watcher watcher1 = new ConcreteWatcher();
    Watcher watcher2 = new ConcreteWatcher();
    Watcher watcher3 = new ConcreteWatcher();
    //把观察者角色加入到主题角色中
    watched.addWatcher(watcher1);
    watched.addWatcher(watcher2);
    watched.addWatcher(watcher3);
    watched.notifyWatchers("上课了!!!");
}
5、其他说明:

观察者模式所作的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/design-pattern-notes-observer-observer-pattern-design-pattern.html
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 11/3
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    没有评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 Programmers’ faith 2012/2/23
2 Struts2笔记 – 简单数据验证 2011/6/19
3 Java基础笔记 – 线程同步问题 解决同步问题的方法 synchronized方法 同步代码块 2011/10/24
4 Java笔记 – 数组 一维数组 多维数组 数组与泛型 数组实用功能 2014/3/14
5 jQuery插件实现的方法和原理简单说明 2012/8/8
6 JSF笔记 – MVC和JSF的介绍和下载使用 2011/12/1
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.