观察者模式(Observer)_java实现

//20210124
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现观察者模式

观察者模式核心思想:

  • 有很多观察者,只有一个被观察者,当被观察者做出什么举动时,所有的观察者都会被通知到,而和被观察者无关的则不会被通知到(被观察者有一个列表,列表中包含所有的观察者的联系方式)

程序源代码:

/**
 * 测试主类
 */
public class Main {
    public static void main(String[] args) {
        //前台作为通知者(也就是被观察者,被观察者通知所有观察者)
        Secretary secretary = new Secretary();

        StockObserver observer1 = new StockObserver("adam",secretary);
        NbaObserver observer2 = new NbaObserver("tom",secretary);

        //前台通知---进入观察者列表中的个体都会被通知到做出相应的动作,没有加进去的就不会做出相应动作
        secretary.attach(observer1);
        secretary.attach(observer2);

        //未通知到,因为已经解除绑定了
//        secretary.detach(observer1);

        //老板回来了
        secretary.setAction("小心!Boss回来了!");
        //发通知
        secretary.notifyObservers();

    }
}
/**
 * 通知者接口
 */
public interface Subject {

    //增加
    void attach(Observer observer);

    //删除
    void detach(Observer observer);

    //通知
    void notifyObservers();

    //状态
    public void setAction(String action);
    public String getAction();
}

/**
 * 观察者父类
 */
public abstract class Observer {
    protected String name;
    protected Subject subject;

    public Observer(String name,Subject subject){
        this.name = name;
        this.subject = subject;
    }

    public abstract void update();
}
/**
 * 被观察者
 */

import java.util.LinkedList;
import java.util.List;

public class Secretary implements Subject{

    //同事列表
    private List<Observer> observers = new LinkedList<>();
    private String action;

    //添加
    @Override
    public void attach(Observer observer) {
        this.observers.add(observer);
    }
    //删除
    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    //通知
    @Override
    public void notifyObservers() {
        for (Observer observer : observers){
            observer.update();
        }
    }


    @Override
    public void setAction(String action) {
        this.action = action;
    }
    //前台状态
    @Override
    public String getAction() {
        return this.action;
    }
}

/**
 * 股票类观察者
 */
public class StockObserver extends Observer{
    public StockObserver(String name,Subject subject) {
        super(name, subject);
    }

    @Override
    public void update() {
        System.out.println(subject.getAction() + "
" + name + "关闭股票行情,继续工作");
    }
}

/**
 * Nba类观察者
 */
public class NbaObserver extends Observer{
    public NbaObserver(String name, Subject subject) {
        super(name, subject);
    }

    @Override
    public void update() {
        System.out.println(subject.getAction()+"
"+name+"关闭NBA,继续工作");
    }
}

  • 输出如下
原文地址:https://www.cnblogs.com/lavender-pansy/p/14332934.html