第十九讲、观察者模式

1.定义

Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其它关联对象,自动刷新对象状态。

Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持同步状态。

2.观察者模式的角色和职责

  • Subject(被观察者)--被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加、删除、通知)一个观察者对象的队列列表。
  • ConcreteSubject--被观察者的具体实现。包含一些基本的属性状态及其他操作。
  • Observer(观察者)--接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
  • ConcreteObserver--观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

3.观察者模式的结构

   

4.Observer模式的典型应用

  • 侦听事件驱动程序设计中的外部事件
  • 侦听/监视某个对象的状态变化
  • 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。

 5.代码演示

package test.com.observer;

import java.util.Observable;
/*
 * 被观察对象--Subject
 */
public class Person extends Observable {
    private String name;
    private String sex;
    private int age;
    
    public Person() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
        //将被观察者的状态设置为已改变
        this.setChanged();
        //通知观察者
        this.notifyObservers();
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
        //将被观察者的状态设置为已改变
        this.setChanged();
        //通知观察者
        this.notifyObservers();
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
        //将被观察者的状态设置为已改变
        this.setChanged();
        //通知观察者
        this.notifyObservers();
    }
}
package test.com.observer;

import java.util.Observable;
import java.util.Observer;
/*
 * 观察者--Observer
 */
public class MyObserve implements Observer {

    @Override
    public void update(Observable arg0, Object arg1) {
        System.out.println("对象已被修改");
    }
}
package test.com.observer;
/*
 * 测试类
 */
public class MainClass {
    public static void main(String[] args) {
        Person per = new Person();
        //注册观察者
        per.addObserver(new MyObserve());
        //修改对象
        per.setAge(12);
        per.setName("张三");
        per.setSex("男");
    }
}

 6.发布者/订阅者示例演示

package test.com.observer2;
/*
 * ConcreteSubject
 */
public class Article {
    private String articleTitle;
    private String articleContent;
    public Article() {
        super();
    }
    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;
    }
}
package test.com.observer2;

import java.util.Observable;
/*
 * 被观察者(Subject)--发布者
 */
public class Publisher extends Observable {
    
    public void notice() {
        Article art = new Article();
        art.setArticleTitle("今天天气状况");
        art.setArticleContent("今天真是美好的一天,天气晴朗!");
        System.out.println("我发布了新的文章");
        //将被观察者的状态设置为已改变
        this.setChanged();
        //通知观察者
        this.notifyObservers(art);
    }
}
package test.com.observer2;

import java.util.Observable;
import java.util.Observer;
/*
 * 观察者(Observer)--订阅者
 */
public class Order implements Observer {
    //arg--被修改的对象
    @Override
    public void update(Observable o, Object arg) {
        Article art = (Article)arg;
        System.out.println("文章主题:" + art.getArticleTitle());
        System.out.println("文章内容:" + art.getArticleContent());
    }

}
package test.com.observer2;
/*
 * 测试类
 */
public class MainClass {
    public static void main(String[] args) {
        Publisher pub = new Publisher();
        pub.addObserver(new Order());
        pub.notice();
    }
}
原文地址:https://www.cnblogs.com/zheaven/p/10191109.html