观察者模式(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