码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之观察者模式

时间:2015-06-01 22:38:12      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:设计模式   观察者模式   

1、概念

Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)
通用类图如下:
技术分享
图片来源于:设计模式之禅。

2、说明

观察者模式,比如:邮箱或者其他网站的订阅功能,服务器推送消息后,订阅了的用户都能收到最新的消息。
我们用的微信公众号应该也类似,有推送了,关注了的用户会收到推送信息。
这是一种一对多的关系。上面所说的订阅或者关注其实是添加依赖关系。让其可以接受到推送或者更新。

3、例子

这里举个小例子,比如,订阅了新闻和广告。如果用户订阅了,其会收到最新的广告和新闻。

概要类图如下:
技术分享

代码如下:
Observer 接口代码:

package phlin.observerpattern;

public interface Observer {

    /**
     * 更新信息,推送信息
     * @param context
     */
    public void update(String context);
}

一号订阅用户,实现Observer 接口:

package phlin.observerpattern;

public class UserTwo implements Observer {

    @Override
    public void update(String context) {
        // TODO Auto-generated method stub
        System.out.println("我是订阅二号,订阅到:"+context);
    }


}

二号订阅用户,实现Observer接口:

package phlin.observerpattern;

public class UserTwo implements Observer {

    @Override
    public void update(String context) {
        // TODO Auto-generated method stub
        System.out.println("我是订阅二号,订阅到:"+context);
    }


}

被观察者接口:

package phlin.observerpattern;

public interface BeObserver {

    public void sendNews();
    public void sendADS();
}

观察者操作接口:

package phlin.observerpattern;

public interface Observable {

    /**
     * 增加观察者
     * @param observer
     */
    public void addObserver(Observer observer);
    /**
     * 注销观察者
     * @param observer
     */
    public void deleteObserver(Observer observer);
    /**
     * 消息推送
     * @param context
     */
    public void notifyOfObserver(String context);

}

具体被观察者代码,实现被观察者接口,实现观察者操作接口:

package phlin.observerpattern;

import java.util.ArrayList;

public class ConcreteBeObserver implements BeObserver ,Observable {

    private ArrayList<Observer> observerList =new ArrayList<Observer>();

    @Override
    public void addObserver(Observer observer) {
        // TODO Auto-generated method stub
        this.observerList.add(observer);
    }

    @Override
    public void deleteObserver(Observer observer) {
        // TODO Auto-generated method stub
        this.observerList.remove(observer);
    }

    @Override
    public void notifyOfObserver(String context) {
        // TODO Auto-generated method stub
        for(Observer observer:observerList)
        {
            observer.update(context);
        }
    }

    @Override
    public void sendNews() {
        // TODO Auto-generated method stub
        this.notifyOfObserver("这是最新新闻,关注国家大事!");
    }

    @Override
    public void sendADS() {
        // TODO Auto-generated method stub
        this.notifyOfObserver("这是最新广告,欢迎购买***产品");
    }

}

测试代码:

package phlin.observerpattern;

public class Test {

    public static void main(String[] args) {

        //具体被观察者
        ConcreteBeObserver conBeObserver=new ConcreteBeObserver();

        //观察者一号、二号:
        Observer UserOne=new UserOne();
        Observer Usertwo=new UserTwo();

        //注册观察者
        conBeObserver.addObserver(UserOne);
        conBeObserver.addObserver(Usertwo);

        //更新消息
        conBeObserver.sendNews();
        conBeObserver.sendADS();

    }
}

测试结果:

我是订阅一号:订阅到:这是最新新闻,关注国家大事!
我是订阅二号,订阅到:这是最新新闻,关注国家大事!
我是订阅一号:订阅到:这是最新广告,欢迎购买***产品
我是订阅二号,订阅到:这是最新广告,欢迎购买***产品

4、参考资料

设计模式之禅

HeadFirst

有所不足,多多指正,谢谢!

设计模式之观察者模式

标签:设计模式   观察者模式   

原文地址:http://blog.csdn.net/androidolblog/article/details/46313841

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!