设计模式之-观察者模式

观察者模式(Observer)
完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
 
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
 
我觉得百度的这个涂就很详细的画出了他们之间的关系
  • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
  • SubjectBookstore:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
  • Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
  • ConcrereStudent:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

下面举个栗子:

比如  有群小学生喜欢看七龙珠漫画,但是书店现在没有,等书店进了新书以后,然后书店去通知小学生前来购买漫画,

这样小学生就是观察者  书店就是被观察者。

定义观察者的抽象:

/**
 * 抽象观察者
 * Created by Administrator on 2017/3/13.
 *
 * 定义一个接口,可以让被观察者更新时主动通知自己
 */

public interface Observer {
        void update(String message);
}

定义观察者的实现-小学生:

/**
 * 具体观察者-小学生
 * Created by Administrator on 2017/3/13.
 * 具体观察者实现抽象观察者接口,可以在收到更新通知后更改自己状态
 */
public class ObserverStudent implements Observer {

    private String userName;

    public ObserverStudent(String userName) {
        this.userName = userName;
    }

    @Override
    public void update(String message) {
        System.out.println(userName + "接到通知:" + message+"-放学就来买!");
    }
}

-----------------------------------------------------------------------------------------------------

定义被观察者的抽象:

/**
 *
 * 抽象的被观察者
 *
 * 1、观察者对象保存在一个集合
 * 2、可以增加和删除观察者对象
 * 3、主动通知观察者
 * Created by Administrator on 2017/3/13.
 */
public interface Subject {

    void addObserver(Observer observer);

    void delObserver(Observer observer);

    void notifyObserver(String message);



}

定义具体的被观察者-书店:

/**
 *
 * 具体被的观察者,实现被观察中者的接口
 * Created by Administrator on 2017/3/13.
 */
public class SubjectBookstore implements Subject{

    //存放观察者的集合
    private List<Observer> userList = new ArrayList<Observer>();

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

    @Override
    public void delObserver(Observer observer) {
        userList.remove(observer);
    }

    @Override
    public void notifyObserver(String message) {
        for(Observer observer :userList){
            observer.update(message);
        }
    }
}

》》》》》》测试下

public class Main {


    public static void main(String [] args){
        Subject subject = new SubjectBookstore();

        Observer ob1 = new ObserverStudent("小凯");
        Observer ob2 = new ObserverStudent("小兰");
        Observer ob3 = new ObserverStudent("小明");


        subject.addObserver(ob1);
        subject.addObserver(ob2);
        subject.addObserver(ob3);

        subject.notifyObserver("七龙珠漫画到了!");


    }
}

测试结果如下:

 以上就简单的实现了观察者模式,不过有优点就有缺点,以后再说!

 
原文地址:https://www.cnblogs.com/lewskay/p/6542107.html