设计模式-观察者模式

作者: 拨云见日aaa | 来源:发表于2019-10-17 15:09 被阅读0次

    一、设计思想

    观察者模式就像订阅报纸一样,每当报社印出新的报纸就会把把报纸送到订阅者家。

    二、自己实现观察者模式

    首先创建一个主题的接口,里面拥有注册观察者的方法,取消注册的方法,发送更新的数据的方法。在创建一个观察者的接口,里面拥有数据更新后的操作的方法。
    代码实现:
    主题接口

    public interface Subject {
    public void registerObserver(Observer ob);
    public void removeObserver(Observer ob);
    public void notifyObserver();
    }
    

    观察者接口

    public interface Observer {
    public void update(int num1,int num2);
    }
    

    主题实现类

    public class Numbers implements Subject{
        List<Observer> list;
        int num1;
        int num2;
        public Numbers() {
            list=new ArrayList<>();
        }
        @Override
        public void registerObserver(Observer ob) {
            // TODO 自动生成的方法存根
            list.add(ob);
        }
    
        @Override
        public void removeObserver(Observer ob) {
            // TODO 自动生成的方法存根
            list.remove(ob);
        }
    
        @Override
        public void notifyObserver() {
            // TODO 自动生成的方法存根
            Iterator<Observer> iterator=list.iterator();
            while(iterator.hasNext()) {
                iterator.next().update(num1, num2);
            }
        }
        public void random() {//模拟数据产生变化
            num1=(int)(Math.random()*100);
            num2=(int)(Math.random()*100);
            notifyObserver();
        }
    }
    

    观察者实现类

    public class Add implements Observer{
        Subject subject;
         public Add(Subject subject) {
             this.subject=subject;
             subject.registerObserver(this);
         }
        @Override
        public void update(int num1, int num2) {
            // TODO 自动生成的方法存根
            int num=num1+num2;
            System.out.println(num+"");
        }
    }
    
    public class Sub implements Observer{
        Subject subject;
    public Sub(Subject subject) {
        this.subject=subject;
        subject.registerObserver(this);
    }
        @Override
        public void update(int num1, int num2) {
            // TODO 自动生成的方法存根
            int num=num1-num2;
            System.out.println(num+"");
        }
    }
    

    测试代码

    public class Test {
    public static void main(String[] args) {
        Numbers numbers=new Numbers();
        Add add=new Add(numbers);
        Sub sub=new Sub(numbers);
        numbers.random();
        numbers.random();
        numbers.random();
        numbers.random();
    }
    }
    

    运行结果:


    运行结果

    三、使用JDK自带的api

    JDK自带一个主题类,使用的时候继承它,这个主题类多了一个setChanged方法,发送更新数据前先调用这个方法,JDK还提供了观察者的接口Observer,观察者需要实现这个接口。
    代码示例:

    主题类

    public class Number extends Observable {
        private int num1;
        private int num2;
    public void random() {
        num1=(int)(Math.random()*100);
        num2=(int)(Math.random()*100);
        setChanged();
        notifyObservers();
    }
    public int getNum1() {
        return num1;
    }
    public int getNum2() {
        return num2;
    }
    }
    

    观察者类

    public class Add implements Observer{
        Observable ob;
    public Add(Observable ob) {
        this.ob=ob;
        ob.addObserver(this);
    }
        @Override
        public void update(Observable arg0, Object arg1) {
            // TODO 自动生成的方法存根
            Number number=(Number)arg0;
            int num=number.getNum1()+number.getNum2();
            System.out.println(num+"");
        }
    
    }
    
    public class Sub implements Observer{
        Observable ob;
        public Sub(Observable ob) {
            this.ob=ob;
            ob.addObserver(this);
        }
        @Override
        public void update(Observable arg0, Object arg1) {
            // TODO 自动生成的方法存根
            Number number=(Number)arg0;
            int num=number.getNum1()-number.getNum2();
            System.out.println(num+"");
        }
    }
    

    测试代码:

    public class Test {
    public static void main(String[] args) {
    Number number=new Number();
    Add add=new Add(number);
    Sub sub=new Sub(number);
    number.random();
    number.random();
    number.random();
    number.random();
        }
    }
    

    运行结果:


    运行结果

    相关文章

      网友评论

        本文标题:设计模式-观察者模式

        本文链接:https://www.haomeiwen.com/subject/abbmmctx.html