上一节将这三个核心层需要的类都实现了,这节就讲下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