观察者模式

一、概念

        观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

二、UML类图

观察者模式_第1张图片

三、基本代码实现

1、Subject类

public abstract class Subject {

        private Listobservers = new ArrayList ();

        public void attach(Observer observer){

                observers.add(observer);

        }

        public void detach(Observer observer){

                observers.remove(observer);

        }

        public void inform(){

                for(Observer observer :observers ){

                    observer.update();

                }

        }

}

2、ConcreteSubject,保存状态信息,在状态发生变化时,给所有登记过的观察者发出通知

public class ConcreteSubject extends Subject {

        private String subjectState;

        public String getSubjectState() {

                return subjectState;

        }

        public void setSubjectState(String subjectState) {

                this.subjectState = subjectState;

        }

}

3、Observer,抽象观察者

public abstract class Observer {

         public abstract void update();

}

4、ConcreteObserver,具体观察者

public class ConcreteObserver extends Observer{

        private String name ;

        private String oberserState;

        private ConcreteSubject subject;

        public ConcreteObserver(ConcreteSubject subject , String name){

                    this.subject = subject;

                    this.name = name ;

        }

        @Override

        public void update() {

                    this.oberserState = subject.getSubjectState();

                    System.out.println("观察者的新状态是" + name + oberserState);

        }

}

5、测试类

public class Main {

        public static void main(String[] args) {

                ConcreteSubject s = new ConcreteSubject();

                s.attach(new ConcreteObserver(s , "观察者1"));

                s.attach(new ConcreteObserver(s , "观察者2"));

                s.attach(new ConcreteObserver(s , "观察者3"));

                s.setSubjectState("111111");

        }

}

四、总结

        将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用带来不方便。而观察者模式的关键对象是主题和观察者,一个主题可以有任意数量的依赖他的观察者,一旦主题状态发生改变,所有的观察者都可以得到通知。主题对象发出通知时,不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道。而任何一个具体观察者也不需要知道其他观察者的存在。

        也就是说当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时,应该考虑观察者模式。

你可能感兴趣的:(观察者模式)