[理解实践PureMVC框架]3-MVC三个核心层的具体实现

本文介绍了PureMVC框架中Model、View和Controller三层的具体实现。Model层仅保存代理引用,不直接存储数据;View层管理中介者和观察者,而界面元素在代理中定义;Controller层作为Model和View的桥梁,逻辑分散在Command类中。整体采用单例模式设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节将这三个核心层需要的类都实现了,这节就讲下Model、View、Controller这三层的具体实现。这三个层都用到了单例模式。

Model层:
我们并不需要在这个层里保存任何数据,所有数据都是通过代理来获取操作的,这个层只需要保存所有代理的引用就可以了。具体的数据类型可以用另外的类来声明,然后将这个数据保存到代理中。该层提供方法注册、获取、移除代理。

/*
 *	Model.ooc
 *	数据层
 */

import structs/HashMap

import interfaces/IModel
import patterns/proxy/Proxy

Model: class implements IModel {
	// 一些脚本语言中的数据使用非常方便,但是ooc-lang中的数据没这么方便
	// 所以用一个哈希表来保存所有代理
	proxyMap: HashMap<String, Proxy>

	// 类的唯一实例
	instance: static Model

	SINGLETON_MSG := "Model Singleton already constructed!"

	init: func {
		// 为构造函数添加一些限制,使其只能实例化一个类的实例
		if (This instance != null) {
			Exception new(SINGLETON_MSG) throw()
		}
		"[ Model ] new()" println()

		instance = this
		proxyMap = HashMap<String, Proxy> new()
		initializeModel()
	}

	// 初始化Model层。一般情况下我们只需要用这一个Model层就行了
	// 如果我们需要自己实现一个具体的Model层,就要重写这个方法,在这里边进行一些初始化操作
	initializeModel: func {
		"[ Model ] initializeModel()" println()
	}

	// 获取类的唯一实例,声明为静态函数
	getInstance: static func -> Model {
		if (This instance == null) {
			This instance = Model new()
		}
		return This instance
	}

	// 注册一个代理,参数就是一个代理的实例了
	registerProxy: func(proxy: Proxy) {
		"[ Model ] registerProxy() #{proxy getProxyName()}" println()

		proxyMap add(proxy getProxyName(), proxy)
		proxy onRegister()
	}

	// 通过代理名称获取代理的实例
	retrieveProxy: func(proxyName: String) -> Proxy {
		"[ Model ] retrieveProxy() #{proxyName}" println()

		proxyMap get(proxyName)
	}

	// 查询是否存在这个代理
	hasProxy?: func(proxyName: String) -> Bool {
		proxyMap get(proxyName) != null
	}

	// 从代理列表中移除这个代理
	removeProxy: func(proxyName: String) -> Proxy {
		"[ Model ] removeProxy() #{proxyName}" println()

		proxy := proxyMap get(proxyName)
		if (proxy != null) {
			proxyMap rem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值