设计模式-观察者模式

观察者模式(Observer Pattern):

       定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

观察者模式的优点:

  • 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
  • 观察者模式在观察目标和观察者之间建立一个抽象的耦合。
  • 观察者模式支持广播通信。
  • 观察者模式符合“开闭原则”的要求。

观察者模式的缺点:

  • 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

设计模式-观察者模式_第1张图片

观察者模式的例子:

观察者目标的接口:

package com.ljx.observer;
public interface MyObserver
{
	void response();  //抽象响应方法
}

观察者的接口:

package com.ljx.observer;
import java.util.*;

public abstract class MySubject
{
	protected ArrayList observers = new ArrayList();
	
	//注册方法
	public void attach(MyObserver observer)
	{
		observers.add(observer);
	} 
	
	//注销方法
	public void detach(MyObserver observer)
	{
		observers.remove(observer);
	}
	
	public abstract void inform(); //抽象通知方法
}

创建观察者目标:

package com.ljx.observer3;

/**
 * @author 别说难忘记
 *
 */
public class Pedestrian implements MyObserver {

	@Override
	public void response() {	
		System.out.println("行人看到斑马线的绿灯亮了,赶紧过马路。");
	}

}


package com.ljx.observer3;

/**
 * @author 别说难忘记
 *
 */
public class Car implements MyObserver {


	@Override
	public void response() {
		
		System.out.println("小轿车司机看到马路的红灯,赶紧把车停稳,等待红灯。");

	}

}

创建观察者目标:

package com.ljx.observer3;

/**
 * @author 别说难忘记
 *
 */
public class Displayer extends MySubject {


	@Override
	public void inform() {
		
		System.out.println("显示器发出信号:斑马线的绿灯亮起来,马路红灯亮起来。");
		System.out.println("-----------------------------");
		for (Object object : observers) {
			((MyObserver)object).response();
		}

	}

}

主函数:

package com.ljx.observer3;

/**
 * @author 别说难忘记
 *
 */
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/**
		 * 创建观察者目标:显示屏,观察者:小轿车,行人
		 * */
		Displayer displayer=new Displayer();
		Car car =new Car();
		Pedestrian pedestrian=new Pedestrian();
		
		/**
		 * 为行人和小轿车添加观察者目标到显示屏
		 */
		displayer.attach(car);
		displayer.attach(pedestrian);
		
		displayer.inform();
	}

}

 

显示结果:

设计模式-观察者模式_第2张图片

 

你可能感兴趣的:(Java,设计模式)