设计模式之4观察者模式

设计模式之四观察者模式


一 概述

1.什么是观察者模式?

将一个对象视作被观察者,当它发出某种行为或者发生某种变化时,通知所有依赖它的对象(观察者),这种设计模式叫做观察者设计模式。

2.观察者设计模式的用途

用于处理一对多的依赖关系,当一个对象的状态发生改变时,通知所有依赖于它的对象,这些对象收到通知以后采取相应的处理措施。

 

二 观察者模式构成

  1. 被观察者接口:包含添加观察者、删除观察者、通知观察者等操作。
  2. 被观察者:实现了被观察者接口,一个具体的被观察者。
  3. 观察者接口:处理被观察者的通知。
  4. 观察者:实现了观察者接口,一个具体的观察者。

 

三 实现Demo

1.被观察者接口

package com.designmode.observer.demo01;

public interface IObservable {

    void addObserver(IObserver observer);

    void removeObserver(IObserver observer);

    void notifyObservers(String message);

} 

2.被观察者

package com.designmode.observer.demo01;

import java.util.ArrayList;
import java.util.List;

public class Performer implements IObservable {

    private List<IObserver> observers;

    public Performer() {
        super();
        observers = new ArrayList<IObserver>();
    }

    @Override
    public void addObserver(IObserver observer) {
        // TODO Auto-generated method stub
        observers.add(observer);
    }

    @Override
    public void removeObserver(IObserver observer) {
        // TODO Auto-generated method stub
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        // TODO Auto-generated method stub
        for (IObserver observer : observers) {
            observer.handleNotify(message);
        }
    }

}

3.观察者接口

package com.designmode.observer.demo01;

public interface IObserver {

    void handleNotify(String message);

}

4.观察者一

package com.designmode.observer.demo01;

public class FirstObserver implements IObserver {

    @Override
    public void handleNotify(String message) {
        // TODO Auto-generated method stub
        System.out.println("观察者FirstObserver接收到消息----[" + message + "]----正在处理");
    }

}

5.观察者二

package com.designmode.observer.demo01;

public class SecondObserver implements IObserver {

    @Override
    public void handleNotify(String message) {
        // TODO Auto-generated method stub
        System.out.println("观察者SecondObserver接收到消息----[" + message + "]----正在处理");
    }

}

6.测试类

package com.designmode.observer.demo01;

import org.junit.Test;

public class ObserverTest {

    @Test
    public void test01() {
        /**
         * 创建观察者
         */
        IObserver firstObserver = new FirstObserver();
        IObserver secondObserver = new SecondObserver();

        IObservable performer = new Performer();// 创建被观察者

        /**
         * 添加观察者
         */
        performer.addObserver(firstObserver);
        performer.addObserver(secondObserver);

        performer.notifyObservers("被观察者发生变化");

    }

}