手记

【设计模式】观察者模式

观察者模式(Observer Pattern)


定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式又叫做发布-订阅(Publish/Subscribe)模式等。


优点:
1.数据逻辑层和表现层分离,定义了稳定的消息更新传递机制;
2.在观察者和观察目标之间建立一个抽象的耦合;
3.支持广播通信,简化一对多系统设计;
4.符合"开闭原则"。


缺点:
1.通知对象多时,会消耗一定的时间;
2.观察者和观察目标有循环依赖时,可能导致系统奔溃;
3.不知道观察的目标是怎么样发生变化的。


UML图


结构:
1.Subject(目标)
又称为主题,它是指被观察的对象。它提供一个接口来增加或者删除一个观察者对象。目标类可以是接口,也可以是抽象类或者实现类。

2.ConcreteSubject(具体目标)
具体目标是目标类的子类,通常包含经常发生改变的数据,同时实现了在目标类中定义的抽象业务逻辑方法。

3.Oberver(观察者)
观察者将对观察目标的改变做出反应,观察者一般定义为接口。

4.ConcerteObserver(具体观察者)
在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态。


例子 猫、狗与老鼠
1.AnimalSubject

package observer_23_1;

import java.util.ArrayList;

/**
 * 动物抽象目标类
 */
public abstract class AnimalSubject
{
    protected ArrayList<AnimalObserver> observers = new ArrayList<AnimalObserver>();
    /**
     * 注册监听
     * @param observer
     */
    public void attach(AnimalObserver observer)
    {
        observers.add(observer);
    }
    /**
     * 注销监听
     * @param observer
     */
    public void detach(AnimalObserver observer)
    {
        observers.remove(observer);
    }

}

2.AnimalObserver

package observer_23_1;
/**
 * 动物观察者接口
 */
public interface AnimalObserver
{
    /**
     * 回应
     */
    void response();
}

3.Cat

package observer_23_1;
/**
 * 猫类
 */
public class Cat extends AnimalSubject
{
    public void cry()
    {
        System.out.println("猫叫!");
        System.out.println("-------------------------");
        //通知其他的观察者
        for(AnimalObserver observer : observers)
        {
            observer.response();
        }
    }
}

4.Mouse

package observer_23_1;
/**
 * 老鼠类
 */
public class Mouse implements AnimalObserver
{

    @Override
    public void response()
    {
        System.out.println("老鼠努力逃跑!");
    }

}

5.Dog

package observer_23_1;
/**
 * 狗类
 */
public class Dog implements AnimalObserver
{

    @Override
    public void response()
    {
        System.out.println("狗也跟着叫");
    }

}

6.Test

package observer_23_1;
/**
 * 测试类
 */
public class Test
{

    public static void main(String[] args)
    {
        Cat subject = new Cat();
        AnimalObserver mouse = new Mouse();
        AnimalObserver dog = new Dog();

        subject.attach(mouse);
        subject.attach(dog);

        subject.cry();

    }

}

运行结果


代码 http://114.215.186.20/14551100130/designPattern/observer_23_1.rar


1人推荐
随时随地看视频
慕课网APP