码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2017-11-09 19:41:59      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:util   ack   一个   mail   nbsp   技术分享   ace   test   set   

观察者模式定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新

原则

  • 为了交互对象之间的松耦合设计而努力,松耦合设计更有弹性更能应对变化

a.定义观察者模式

技术分享
 

b.自己实现观察者模式

/**
 * Created by xjw on 2017/11/9 16:53
 * Email 1521975316@qq.com
 */

public class Test {

    public interface Display {
        void display();
    }

    public interface Observer {
        void update(int a, int b, int c);
    }

    public interface Subject {
        void addObserver(Observer observer);

        void removeObserver(Observer observer);

        void notifiObserver();
    }

    static class WeekDate implements Subject {

        private List<Observer> observers;

        private int a;
        private int b;
        private int c;

        public WeekDate() {
            this.observers = new ArrayList<>();
        }

        @Override
        public void addObserver(Observer observer) {
            observers.add(observer);
        }

        @Override
        public void removeObserver(Observer observer) {
            int i = observers.indexOf(observer);
            if (i >= 0) {
                observers.remove(i);
            }
        }

        @Override
        public void notifiObserver() {
            for (int i = 0; i < observers.size(); i++) {
                observers.get(i).update(a, b, c);
            }
        }

        public void setData(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
            notifiObserver();
        }

    }

    static class AObserver implements Observer, Display {

        private int a;
        private int b;
        private int c;

        public AObserver(Subject subject) {
            subject.addObserver(this);
        }

        @Override
        public void update(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
            display();
        }

        @Override
        public void display() {
            System.out.println("a:" + a + ";b:" + b + ";c:" + c);
        }
    }

    public static void main(String[] args) {

        WeekDate subject = new WeekDate();
        AObserver observer = new AObserver(subject);

        subject.setData(1, 2, 3);
        subject.setData(4, 5, 6);

        subject.removeObserver(observer);

        subject.setData(7, 8, 9);

    }

}

c.Java提供的观察者模式

  • 观察者接口(java.util.Observer)
  • 可被观察者类(java.util.Observable),相当于主题Subject
java学习群669823128


观察者模式

标签:util   ack   一个   mail   nbsp   技术分享   ace   test   set   

原文地址:http://www.cnblogs.com/-reset/p/7810820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!