观察者模式:顾名思义,其实就类似于监听器一样,当被观察者发生了变化,观察者能发出相应的响应。
1、定义:
定义对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,其相关依赖的对象将被通知并自动更新。
2、模式结构:
(1)Subject(目标类):定义观察者集合。提供接口增加或删除观察者对象,定义通知方法。
(2)ConcreteSubject(具体目标):目标类子类,负责向各个观察者通知。
(3)Observer(观察者类):对所观察的目标的改变做出反应。
(4)ConcreteObserver(具体观察者):实现更新数据的方法。
3、案例分析:
(猫、老鼠和狗之间的关系:猫是目标,狗和老鼠是观察者)
(1)抽象目标类 AniSubject
public abstract class AniSubject
{
protected ArrayList observers = new ArrayList();//用于存放多个观察者
//注册方法
public void attach(AniObserver observer)
{
observers.add(observer);
}
//注销方法
public void detach(AniObserver observer)
{
observers.remove(observer);
}
//抽象通知方法
public abstract void action();
}
(2)具体目标类 Cat
public class Cat extends AniSubject
{
public void action()
{
System.out.println("猫叫!!!");
for(Object obs:observers)
{
((AniObserver)obs).response();
}
}
(3)抽象观察者类 AniObserver
public interface AniObserver
{
public void response();
}
(4)具体观察者类 Mouse
public class Mouse implements AniObserver
{
public void response()
{
System.out.println("老鼠赶紧逃跑!!!");
}
}
(5)具体观察者类 Dog
public class Dog implements AniObserver
{
public void response()
{
System.out.println("狗跟着叫!!!");
}
}
(6)测试类
public class Client
{
pblic static void main(String [] args)
{
AniSubject sub = new Cat();
AniObserver obs1,obs2,obs3;
obs1 = new Mouse();
obs2 = new Dog();
sub.attach(obs1);
sub.attach(obs2);
sub.action();
}
}
4、模式优缺点:
(1)优点:将表示层和数据逻辑层分离,在观察目标和观察者之间建立抽象的耦合。
(2)缺点:若观察者过多,通知过程耗时。会有导致系统崩溃的可能性出现。
5、模式应用:
(1)Java语言提供对观察者模式的支持:在 JDK 的 java.util 包中,提供 Observable 类和 Observer 接口。
(2)MVC 架构模式使用了该模式,观察目标就是 Model ,观察者就是 View, Controller 为两者之间的中介。
网友评论