观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当这个目标在状态上发生变化时,会通知所有观察者对象。
观察者模式也被称为: 发布-订阅模式 / 模型-视图模式 /源-监听器模式 / 从属者模式
优点:实现了表现层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰。
被观察的目标并不需要知道任何一个具体观察者,只知道它们都有一个共同的接口。
缺点:虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制让观察者知道所观察的对象是怎么发生变化的。
下面通过各种类型的车观察红绿灯的例子来讲解观察者模式
各种类型的车继承抽象观察者,而路灯就是被观察者
package com.pattern.Observer;//抽象观察者
interface Observer {
public void start();
public void stop();
}
package com.pattern.Observer;
//货车
public class Truck implements Observer{//具体观察者(观察红绿灯)
@Override
public void start() {
System.out.println("货车启动!");
}
@Override
public void stop() {
System.out.println("货车停止!");
}
}
package com.pattern.Observer;
//汽车
public class Car implements Observer{//具体观察者(观察红绿灯)
@Override
public void start() {
System.out.println("汽车启动!");
}
@Override
public void stop() {
System.out.println("汽车停止!");
}
}
package com.pattern.Observer;
import java.util.ArrayList;
import java.util.List;
public class Light {//红绿灯
private String color;
private List<Observer> list = new ArrayList<>();
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
notifyAllObserver();
}
public void add(Observer observer){
list.add(observer);
}
public void notifyAllObserver(){
if(color.equals("红色")){
for(Observer o:list){
o.stop();
}
}else if(color.equals("绿色")){
for(Observer o:list){
o.start();
}
}
}
}
package com.pattern.Observer;
public class Test {
public static void main(String[] args) {//测试类
Observer car = new Car();
Observer truck = new Truck();
Light l = new Light();
l.add(car);
l.add(truck);
l.setColor("红色");
System.out.println("---------------------------");
l.setColor("绿色");
System.out.println("---------------------------");
l.setColor("红色");
System.out.println("---------------------------");
l.setColor("绿色");
}
}
运行结果:
汽车停止!
货车停止!
---------------------------
汽车启动!
货车启动!
---------------------------
汽车停止!
货车停止!
---------------------------
汽车启动!
货车启动!