设计模式之观察者模式

Vue

Vue 是构建用户接口的 JS 框架,核心

  • 声明式渲染,数据的双向绑定 [基于MVVM模式]
  • 组件化开发 [基于虚拟的DOM 文档对象模型]

MVVM

M-V-VM 框架

  • 基于 观察者设计模式 / 订阅-发布模式

  • MVC 的进阶版

  • Model 被观察者(主题/发布方)

  • View 观察者(主题的订阅者)

  • ViewModel 将 model 和 view 解耦

      	应用场景
      	- GUI
      		- Windows UI
      		- iOS
      		- android
      	- Web 前端框架
      		- angular  JS
      		- Vue		JS
      		- React	JS
    

下面就 MVVM 简单 实现 观察者模式:

M 指 model,数据模型 - 被观察者(主题/发布方)
V 指 view ,视图层 - 观察者(主题的订阅者)

1.被观察者(model)

被观察者类 Model
需要 继承 Observable 类,状态改变后,需要setChanged(),否则通知观察者无效。

import java.util.Observable;

// 数据模型
// 被观察者
// 可被观察的模型/发布者
public class Model  extends Observable{

	// 数据、状态
	int n;

	/**
	 * 改变 n
	 * @param n
	 */
	public void setN(int n) {
		this.n = n;
		
		// 默认是false,调用该方法设置为true,即发生改变,在通知之前要调用
		// 设置,状态改变
		setChanged();
		
		// 通知观察者 
//		notifyObservers();
		
		// 通知观察者 携带参数
		notifyObservers(n);
	}
	
	public int getN() {
		return n;
	}
	
}

被观察者类 ModelB

import java.util.Observable;

public class ModelB extends Observable{
	
	public static final int MSG_PRICE = 1;

	public static final int MSG_TITLE = 2;

	double price;
	
	String title;
	
	public void setPrice(double price) {
		this.price = price;
		setChanged();
		// 携参,告知观察者消息的类型
		notifyObservers(MSG_PRICE);
	}
	
	public void setTitle(String title) {
		this.title = title;
		setChanged();
		// 携参,告知观察者消息的类型
		notifyObservers(MSG_TITLE);
	}
	
	public double getPrice() {
		return price;
	}
	
	public String getTitle() {
		return title;
	}
}

2.观察者(view)

观察者类需要实现 Observer 接口,实现 update() 方法,如果观察者关注了多个主题,可以通过 instanceof 判断传入的被观察对象是属于哪个主题,进而做出不同的响应。如果关注的主题存在多个状态发生改变,可以判断状态的类型,进而做出不同的响应。

观察者 UiBar

import java.util.Observable;
import java.util.Observer;

public class UiBar implements Observer{

	// 内置的回调方法
	/**
	 * 参数
	 * 1)被观察的对象
	 * 2) 观察者发通知时传递的参数
	 */
	@Override
	public void update(Observable o, Object arg) {
		
		// 更新由 Model 触发的
		if(o instanceof Model) {
			// 转型
			Model m = (Model) o;
			System.out.println("UiBar收到:模型 Model 状态更新了"+ m.getN());
		}
		
		// 更新由 ModelB 触发的
		if(o instanceof ModelB) {
			
			ModelB m2 = (ModelB)o;
			
			int msg = (int)arg;
			switch (msg) {
			case ModelB.MSG_PRICE:
				System.out.println("UiBar收到:模型 ModelB 更新了 ::价格::"+m2.getPrice());
				break;
			case ModelB.MSG_TITLE:
				System.out.println("UiBar收到:模型 ModelB 更新了 ::标题::"+m2.getTitle());
				break;
			}
		}
	}

}

观察者 UiFoo

import java.util.Observable;
import java.util.Observer;

// 观察者
public class UiFoo implements Observer{

		// 回调方法
		@Override
		public void update(Observable o, Object arg) {
			
			// 更新由 Model 触发的
			if(o instanceof Model) {
				// 
				Model m = (Model) o;
				System.out.println("UiFoo收到:模型 Model 状态更新了"+ m.getN());
			}
			
			// 更新由 ModelB 触发的
			if(o instanceof ModelB) {
				
				ModelB m2 = (ModelB)o;
				
				int msg = (int)arg;
				switch (msg) {
				case ModelB.MSG_PRICE:
					System.out.println("UiFoo收到:模型 ModelB 更新了 ::价格::"+m2.getPrice());
					break;
				case ModelB.MSG_TITLE:
					System.out.println("UiFoo收到:模型 ModelB 更新了 ::标题::"+m2.getTitle());
					break;
				}
			}
		}


}

3.主方法调用(main)

public class App {

	// 订阅/发布模式
	// 观察者模式	
	public static void main(String[] args) {
		
		// M-V-VM 框架:
		
		// Model 被观察者(主题/发布方)
		// View  观察者(主题的订阅者)
		// ViewModel 将 model 和 view 解耦
		
		
		// 被观察者(例如:公众号) 
		// 创建两个被观察者 
		Model m = new Model();
		ModelB m2 = new ModelB();
		
		// View 是数据(Model)的 观察者
		// 创建两个观察者
		UiFoo foo = new UiFoo();
		UiBar bar = new UiBar();
		
		// 关注公众号 m, 放入 m 的 观察者列表 中
		m.addObserver(foo);
		m.addObserver(bar);
		// 关注公众号 m2, 放入 m2 的 观察者列表 中		
		m2.addObserver(foo);
		m2.addObserver(bar);
		
		// 数据改变,状态改变时,视图会自动更新
		m.setN(9);
		
		m2.setPrice(9.9);
		m2.setTitle("观察者模式");
		
		System.out.println("****************");
		
		// 删除观察者,即取消关注公众号
		// 从 m 的 观察者列表 中移除
		m.deleteObserver(foo);
		
		m.setN(333);
		
		
		
	}
}

查看控制台输出
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值