Java 观察者模式( Observer Pattern)

观察者模式

在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新

这里写图片描述

package gx.subject;

import gx.observer.Observer;

/**
 * 主题接口
 * @author always
 *
 */
public interface Subject {

    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObserver();

}
package gx.observer;

/**
 * 
 * 接受到通知后 数据显示的接口
 * 
 * @author always
 *
 */
public interface Display {

    void display();
}
package gx.observer;

/**
 * 
 * 观察者的接口
 * 
 * @author always
 *
 */
public interface Observer {

    /**
     * pull:观察者自己获得的想要的数据:“拉”
     */
    void update();

    /**
     * push:主题推送所有消息给观察者
     * 
     * @param tiltle
     * @param name
     * @param summary
     */
    void update(String tiltle,String name,String summary);

}
package gx.observer.impl;

import gx.observer.Display;
import gx.observer.Observer;
import gx.subject.Subject;
import gx.subject.impl.CurrentSubject;

public class StudentObserver implements Observer,Display{

    private Subject subject;

    private String title;
    private String name;
    private String summary;

    public StudentObserver(){

    }

    public StudentObserver(Subject subject){
        this.subject=subject;
        subject.registerObserver(this);
    }


    public void update() {
        if (subject instanceof CurrentSubject) {

            CurrentSubject cs = (CurrentSubject) subject;
            this.name=cs.getName();
            this.title=cs.getTitle();
            this.display();
        }
    }

    public void update(String title, String name, String summary) {
        this.title=title;
        this.name=name;
        this.summary=summary;
        this.display();
    }


    public void display() {
        System.out.println("我是一名学生,今天我订阅的新闻是:\n 新闻标题:"+title+",新闻作者:"+name+",新闻简介:"+summary+";");
    }

}
package gx.observer.impl;

import gx.observer.Display;
import gx.observer.Observer;
import gx.subject.Subject;
import gx.subject.impl.CurrentSubject;

public class TeacherObserver implements Observer,Display{

    private Subject subject;

    private String title;
    private String name;
    private String summary;

    public TeacherObserver(){

    }

    public TeacherObserver(Subject subject){
        this.subject=subject;
        subject.registerObserver(this);
    }


    public void update() {
        if (subject instanceof CurrentSubject) {
            CurrentSubject cs = (CurrentSubject) subject;
            this.name=cs.getName();
            this.title=cs.getTitle();
            this.display();
        }
    }

    public void update(String title, String name, String summary) {
        this.title=title;
        this.name=name;
        this.summary=summary;
        this.display();
    }


    public void display() {
        System.out.println("我是一名老师,今天我订阅的新闻是:\n 新闻标题:"+title+",新闻作者:"+name+",新闻简介:"+summary+";");
    }

}
package gx.subject.impl;

import gx.observer.Observer;
import gx.subject.Subject;

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

/**
 * 这个例子:模拟学生,老师 订阅报纸
 * 
 * 此对象改变 依赖它的对象:observerList 中的对象都会收到通知
 *      setData-->notifyObserver-->observer.update()-->observer.display()
 * @author always
 *
 */
public class CurrentSubject implements Subject {

    private List<Observer> observerList;
    private String title;
    private String name;
    private String summary;



    public CurrentSubject(){
        observerList=new ArrayList<Observer>();
    }

    public void registerObserver(Observer observer) {
        if(observer!=null){
            observerList.add(observer);
        }
    }

    public void removeObserver(Observer observer) {

        int indexOf = observerList.indexOf(observer);
        if(indexOf!=-1){
            observerList.remove(indexOf);
        }
    }

    public void notifyObserver() {

        for(Observer observer :observerList){
            observer.update(title, name, summary);
        }
    }

    public void setMessage(String title,String name,String summary){

        this.title=title;
        this.name=name;
        this.summary=summary;
        notifyObserver();
    }

    public String getTitle() {
        return title;
    }

    public String getName() {
        return name;
    }

    public String getSummary() {
        return summary;
    }


}

测试类

package gx.test;

import junit.framework.TestCase;
import gx.observer.Observer;
import gx.observer.impl.StudentObserver;
import gx.observer.impl.TeacherObserver;
import gx.subject.impl.CurrentSubject;

public class TestObserver extends TestCase{

    public void testObserverPush(){

        CurrentSubject cs= new CurrentSubject();

        Observer observer=new StudentObserver(cs);
        cs.registerObserver(new StudentObserver());
        cs.registerObserver(new TeacherObserver());

        cs.setMessage("设计模式","白","你好");//主题状态改变:this.notifyObserver-->observer.update-->observer.display


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值