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

编程模式之观察者模式(Observer)

时间:2016-12-23 22:58:11      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:string   组成   nts   font   server   java代码   static   round   lis   

观察者模式由四个角色组成:抽象主题角色,抽象观察者角色,具体主题角色,抽象观察者角色,具体观察者角色

抽象主题角色(Subject):把所有的观察者角色的引用保存在一个集合中,可以有任意数量的观察者。其提供一个接口,可以添加、删除观察者,并可以向登记过的观察者发送通知。

具体主题角色(Observer):实现了抽象主题角色提供的接口的一个具体类。

抽象观察者角色(ConcreteSubject):提供一个借口,以接收主题角色发送的通知。

具体观察者角色(ConcreteObserver):实现了抽象观察者角色提供的接口的一个具体类。

 

 类图

技术分享

 

JAVA代码:

package com.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 抽象主题角色,被观察
 * @author hyp
 *
 */
public interface Subject
{
    void addWatcher(Watcher watcher);
    void removeWatcher(Watcher watcher);
    void notify(String message);
}


/**
 * 抽象观察者角色,观察主题
 * @author hyp
 *
 */
public interface Watcher
{
    void update(String message);
}




/**
 * 具体主题角色
 * @author hyp
 *
 */
public class ConcreteSubject implements Subject
{
    private List<Watcher> watchers = new ArrayList<Watcher>();
    
    @Override
    public void addWatcher(Watcher watcher)
    {
        watchers.add(watcher);
    }

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

    @Override
    public void notify(String message)
    {
        for(Watcher w:watchers)
        {
            w.update(message);
        }
    }
}


/**
 * 具体观察者橘色
 * @author hyp
 *
 */
public class ConcreteWatcher implements Watcher
{

    @Override
    public void update(String message)
    {
        System.out.println(this.toString()+ ":" + message);
    }
}

/**
 * 测试观察者模式
 * @author hyp
 *
 */
public class Test
{
    public static void main(String[] args)
    {
        Subject subject= new ConcreteSubject();
        Watcher watcher1 = new ConcreteWatcher();
        Watcher watcher2 = new ConcreteWatcher();
        Watcher watcher3 = new ConcreteWatcher();
        
        Subject.addWatcher(watcher1);//添加观察者
        Subject.addWatcher(watcher2);
        Subject.addWatcher(watcher3);
        
        Subject.notify("Hello");//通知所有观察者
        
        Subject.removeWatcher(watcher1);//移除一个观察者
        
        Subject.notify("bye~");
        
    }
}

 

 

编程模式之观察者模式(Observer)

标签:string   组成   nts   font   server   java代码   static   round   lis   

原文地址:http://www.cnblogs.com/justmehyp/p/6216120.html

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