观察者模式,是一种对象的行为模式,其定义了对象之间的一对多的关系,能够使得某一对象的状态或属性改变的时候该对象所对应的多个对象能够自动更新。这个对象就叫被观察者,它所对应的其他对象叫观察者。其主要作用是能够解耦,并且能够保证观察者们这些低耦合对象间的行为协调一致。那么观察者模式到底是怎么回事呢,下面用代码说明。
1.被观察者,对象一对多关系中“一”的那方,多个观察者“观察”该对象的同一或不同属性,该对象的被观察的属性改变后通知观察者做出对应的操作
/**
* 被观察者
*/
class Tartget{
//被观察的属性
private int status;
//观察者集合
private List<IObserver> observers = new ArrayList<>();
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
notifyObservers();
}
//为该对象添加一个观察者
public void attach(IObserver observer){
observers.add(observer);
}
//通知所有观察者属性已经改变
public void notifyObservers() {
for (IObserver observer : observers) {
observer.update(status);
}
}
}
2.观察者接口,所有具体观察者都应该实现该接口,该接口定义一个更新方法,具体的更新操作由具体观察者决定。
interface IObserver{
public void update(int status);
}
3.具体观察者,实现观察者接口,然后在更新方法中定义自己想要进行的操作。
class AObserver implements IObserver{
@Override
public void update(int status) {
System.out.println("AObserver收到通知,目标状态改变!----》status:"+status);
}
}
class BObserver implements IObserver{
@Override
public void update(int status) {
System.out.println("BObserver收到通知,目标状态改变!----》status:"+status);
}
}
4.main方法
public static void main(String[] args) {
Tartget tartget = new Tartget();
IObserver aobserver = new AObserver();
IObserver bobserver = new BObserver();
tartget.attach(aobserver);
tartget.attach(bobserver);
tartget.setStatus(1);
}
观察者模式在工作中用到挺多的,spring框架中的事件机制就用到了观察者模式的思想。下面举个生活中的例子来帮助大家理解。
红绿灯,城市中生活离不开红绿灯,红绿灯用来协调不同方向上的车辆,行人的动作,以保证交通的畅通。下面是一个红绿灯的例子,这个例子很简单,就一个红绿灯,红灯亮,汽车停,行人过马路,绿灯亮,汽车行,行人等待。当然和实际生活中的不一样,我这只是举个例子。
import java.util.ArrayList;
import java.util.List;
/**
* 红绿灯,即被观察者
*/
public class TrafficLight {
private LightColor color;
private List<Iobserver> iobservers = new ArrayList<>();
public LightColor getColor() {
return color;
}
public void setColor(LightColor color) {
this.color = color;
notifyObserver();
}
private void notifyObserver(){
for (Iobserver iobserver : iobservers) {
iobserver.update(color);
}
}
public void attach(Iobserver iObserver){
iobservers.add(iObserver);
}
}
enum LightColor{
red,
green
}
/**
*观察者接口
*/
interface Iobserver{
void update(LightColor color);
}
class People implements Iobserver{
@Override
public void update(LightColor color) {
switch (color) {
case red:
System.out.println("行人过马路");
break;
case green:
System.out.println("行人等待");
}
}
}
class Car implements Iobserver{
@Override
public void update(LightColor color) {
switch (color) {
case green:
System.out.println("汽车过马路");
break;
case red:
System.out.println("汽车等待");
}
}
}
class test{
public static void main(String[] args) throws InterruptedException {
TrafficLight trafficLight = new TrafficLight();
trafficLight.attach(new People());
trafficLight.attach(new Car());
trafficLight.setColor(LightColor.green);
Thread.sleep(5000);
trafficLight.setColor(LightColor.red);
}
}