观察者模式(又称为模型(Model)-视图(View)模式、源-收听者(Listener)模式)

观察者模式定义

Java观察者模式定义 :对象间一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都得到通知并自动更新。举个例子:用户界面(view层)可以作为一个观察者,seriver层是被观察者,当观察者观察到一则数据时,view层得到数据并产生相应处理。再比如,生活中订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

观察模式的核心:

一.被观察者实现以下两步(非常重要):

  1.定义一个抽象被观察者接口(Observerabel):里面至少有addObserver方法removeObserver方法notify方法。

  2.一个具体的类实现被观察者接口(seriver):比如订阅模式中发布者。当发布者得到信息要发送是,要用notify方法给所有的订阅者通知。

二.观察者实现以下两步:

 1.定义一个观察者接口(Observer):里面有update方法。

 2.一个类实现观察者接口 (view):比如订阅模式中订阅者,当发布者发布消息,当前订阅者(自己)可以收到消息。

观察者模式具体实现

   上述讲了观察者模式的两个核心,下面小编来实现它

首先完成两个接口。也可以定义成抽象类

package com.util.test;

public interface Observerable {
		//添加观察者,参数需要一个实现了观察者接口的类!!!
	void addObserver(Observer observer);
	        //删除观察者,参数需要一个实现了观察者的接口的类!!!
	void removeObserver(Observer observer);
	        //向所有的观察者发送数据
	void notify(String info);
}
package com.util.test;

public interface Observer {
	//更新数据
	public void update(String info);
}

有了这两个接口,我们定义两个类实现它

package com.util.test;

import java.util.ArrayList;
import java.util.List;

public class Seriver implements Observerable {
	//定一个观察者list
	private List<Observer> list;
	
	public Seriver() {
		list = new ArrayList<>();
	}
	//定义一个addion方法,当遇到需要发布的内容,调运notify方法
        public void dealAction(String message) {
    	        if(message.contains("新年快乐")) {
    		    notify(message);
    	        }
        }
    
	@Override
	public void addObserver(Observer observer) {
		if(!list.contains(observer)) {
			list.add(observer);
		}		
	}

	@Override
	public void removeObserver(Observer observer) {
		if(!list.isEmpty() && list.contains(observer)) {
			list.remove(observer);
		} 
	}

	@Override//向所有观察者发送消息
	public void notify(String info) {
		for(Observer observer : list) {
			observer.update(info);
                }	
	}

}

 

public class View implements Observer {

	public View() {
	}

	@Override
	public void update(String info) {
		System.out.println(" 收到seriver的推送消息: " + info);
	}

}

 展示应用

package com.util.test;

public class test {
	public static void main(String[] args) {
		Seriver seriver = new Seriver();
		View view = new View();
		
		seriver.addObserver(view);
                //给一个动作让处理
		seriver.dealAction("祝大家新年快乐");
	}
}

Java图像观察者 java观察者模式详解_ide

 简单的应用观察者模式展示到此,或许你懂了,但是不太会用,当你处理某一个让你头大的编程难题时。

突然发现监听者模式巧妙的解决了它。你一定会感受到它的巧妙。