ITPub博客

首页 > IT职业 > IT图书 > 【设计模式】观察者模式

【设计模式】观察者模式

IT图书 作者:my420 时间:2021-09-09 08:58:05 0 删除 编辑

观察者模式(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 observers = new ArrayList();
    /**
     * 注册监听
     * @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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/406/viewspace-2798362/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-07-23

  • 博文量
    0
  • 访问量
    478