设计模式-观察者模式1(Observer)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/slh2016/article/details/85035057

概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

使用场景:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

优劣:

  1. 优点:观察者和被观察者是抽象耦合,松耦合;
  2. 缺点:被观察者(目标)对象有很多直接或间接的观察者时,通知时间变长;观察者与被观察者相互依赖、通知的话会造成死循环系统崩溃;观察者只知道结果的变化,具体目标对象如何变化的无法知道。

示例:

package designPattern.observer;

/**
 * 被观察者接口
 * 定义了添加、删除、发送通知方法
 * @author sunlh
 *
 */
public interface Observerable {
	
	void registerObserver(Observer observer);
	void removeObserver(Observer observer);
	void notifyObserver(String message);
	
}

package designPattern.observer;
/**
 * 观察者接口
 * 被观察者调用notifyObserver()时,调用此update()方法
 * @author sunlh
 *
 */
public interface Observer {
	
	void update(String message);
	
}

package designPattern.observer;

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

/**
 * 被观察者对象
 * 实现注册观察对象,撤销观察对象和通知的方法
 * 定义List变量存储所有的观察者对象
 * @author sunlh
 *
 */
public class WechatServer implements Observerable{

	private List<Observer> observers;
	private String message;
	
	public WechatServer() {
		observers = new ArrayList<>();
	}
	
	@Override
	public void registerObserver(Observer observer) {
		if (observer != null) {
			observers.add(observer);
		}
	}

	@Override
	public void removeObserver(Observer observer) {
		if (!observers.isEmpty() && observer != null) {
			observers.remove(observer);
		}
	}

	@Override
	public void notifyObserver(String message) {
		this.message = message;
		System.out.println("微信服务更新消息:" + message);
		for (Observer observer : observers) {
			observer.update(this.message);
		}
	}

}

package designPattern.observer;

public class User1 implements Observer{

	private String name;
	private String message;
	
	public User1(String name) {
		this.name = name;
	}
	
	@Override
	public void update(String message) {
		this.message = message;
		System.out.println(name + "接收到消息:" + this.message);
	}

}

package designPattern.observer;

public class User2 implements Observer{

	private String name;
	private String message;
	
	public User2(String name) {
		this.name = name;
	}
	
	@Override
	public void update(String message) {
		this.message = message;
		System.out.println(name + "接收到消息:" + this.message);
	}

}

package designPattern.observer;

public class User3 implements Observer{

	private String name;
	private String message;
	
	public User3(String name) {
		this.name = name;
	}
	
	@Override
	public void update(String message) {
		this.message = message;
		System.out.println(name + "接收到消息:" + this.message);
	}

}

package designPattern.observer;
/**
 * 测试类
 * @author sunlh
 *
 */
public class Test {
	
	public static void main(String[] args) {
		// 定义具体观察者
		Observer user1 = new User1("张三");
		Observer user2 = new User2("李四");
		Observer user3 = new User3("王五");
		
		// 定义被观察者
		Observerable wechatServer = new WechatServer();
		
		// 注册观察者
		wechatServer.registerObserver(user1);
		wechatServer.registerObserver(user2);
		wechatServer.registerObserver(user3);
		
		// 目标发布消息,观察者接收
		wechatServer.notifyObserver("Java是世界上最好的语言");
		wechatServer.removeObserver(user2);
		wechatServer.notifyObserver("汉语是世界上最好的语言");
	}
	
}

测试结果:

微信服务更新消息 Java是世界上最好的语言
张三接收到消息:Java是世界上最好的语言
李四接收到消息:Java是世界上最好的语言
王五接收到消息:Java是世界上最好的语言
微信服务更新消息:汉语是世界上最好的语言
张三接收到消息:汉语是世界上最好的语言
王五接收到消息:汉语是世界上最好的语言

猜你喜欢

转载自blog.csdn.net/slh2016/article/details/85035057