zoukankan      html  css  js  c++  java
  • 观察者模式(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,继续工作");
        }
    }
    
    
    • 输出如下
  • 相关阅读:
    【2017 Multi-University Training Contest
    【“玲珑杯”ACM比赛 Round #20 H】康娜的数学课
    【hdu 6181】Two Paths
    Cache coherence protocol
    C#实现图片的无损压缩
    收集一些常用的正则表达式
    收集一些常用的正则表达式
    收集一些常用的正则表达式
    Sql中存储过程的定义、修改和删除操作
    Sql中存储过程的定义、修改和删除操作
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/14332934.html
Copyright © 2011-2022 走看看