重学设计模式(三设计模式-观察者模式)
Posted 穆瑾轩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学设计模式(三设计模式-观察者模式)相关的知识,希望对你有一定的参考价值。
1、观察者模式
以前在学校上晚自习,有的同学吃零食,有的同学玩手机,还有的同学在聊天,突然有个同学(被观察者)跑进来,说了就老师来了,得到通知的同学们(观察者),立刻做出反应,吃零食的同学立刻把零食藏了起来,玩手机的同学也收起来了手机,聊天的同学也正襟危坐的端起了书本。这就是我们所说的观察者模式。
1.1、什么是观察者模式
-
定义
观察者模式是一种行为设计模式,指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
这种模式和发布-订阅模式很像,不同的是,发布-订阅模式,一般有一个调度中心,调度中心有拉模式和推模式来推送消息。
观察者模式的结构:
1)抽象观察者(Observer)角色:是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
2)具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
3)抽象主题(Subject)角色:它提供了一个用于保存观察者对象的类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
4)具体主题(Concrete Subject)角色:它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
观察者模式的意图在于:主要解决多个对象间存在一对多的依赖关系,当一个对象状态改变给其他对象通知的问题,让主题和观察者之间松耦合。
1.2、观察者模式的优缺点
-
优点
1)符合开闭原则,引入新的观察者无需更改主题(目标)的代码,降低了主题与观察者之间的耦合关系;
2)可以在运行时建立对象之间的关系。
-
缺点
当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
1.3、创建方式
我们以晚自习,学生看到班主任来巡视为例。
1)抽象观察者(Observer)角色
//抽象观察者
public interface Observer
void response(); //反应
2)具体观察者(Concrete Observer)角色
//不同的观察者,做出不同的反应
//具体观察者-学生A
public class ConcreteStudentA implements Observer
@Override
public void response()
System.out.println("学生A,收起自己的零食");
//具体观察者-学生B
public class ConcreteStudentB implements Observer
@Override
public void response()
System.out.println("学生B,收起自己的手机");
//具体观察者-学生C、D
public class ConcreteStudentCD implements Observer
@Override
public void response()
System.out.println("学生C和D,停止聊天,正襟危坐的看书");
3)抽象主题(Subject)角色
//抽象主题,提供保存观察者的类,可以新增或移除观察者
public abstract class Subject
protected List<Observer> observers = new ArrayList<Observer>();
//增加观察者方法
public void add(Observer observer)
observers.add(observer);
//删除观察者方法
public void remove(Observer observer)
observers.remove(observer);
public abstract void notifyObserver(); //通知观察者方法
4)具体主题(Concrete Subject)角色
//具体主题
public class ConcreteSubject extends Subject
@Override
public void notifyObserver()
System.out.println("被观察者看到班主任来了,喊了一句:老师来了!");
for (Object obs : observers)
((Observer)obs).response(); //观察者做出反应
5)客户端
public class Client
public static void main(String[] args)
Subject subject = new ConcreteSubject();
Observer obsA = new ConcreteStudentA();
Observer obsB = new ConcreteStudentB();
Observer obsC = new ConcreteStudentCD();
subject.add(obsA);
subject.add(obsB);
subject.add(obsC);
subject.notifyObserver(); //通知观察者
案例效果:
此时的UML关系图:
1.4、总结及建议
观察者模式的在对象间定义一对多的依赖,当一个对象改变状态,依赖的对象都会收到通知,并自动更新。Swing、JavaBeans、RMI中都有观察者模式的应用。
应用场景:
1)对象间存在一对多关系,一个对象的状态发生改变会影响其他对象时,可以使用观察者模式;
2)当应用程序中的某些对象必须观察其他对象时,可以使用观察者模式。
JDK中观察者模式的应用:
java.util.Observer/ java.util.Observable
java.util.EventListener
以上是关于重学设计模式(三设计模式-观察者模式)的主要内容,如果未能解决你的问题,请参考以下文章