[理解实践PureMVC框架]4-给MVC三层提供统一接口的Facade层的具体实现

设计模式中的外观模式的作用是给一些子模块封装方法,它本身不实现额外的功能。通过外观类的封装,使得外界调用接口的时候不必清楚各个子模块的实现细节,只需知道调用哪个方法就可以了。当然,有了外观类,也是可以直接调用子模块中的方法的。

PureMVC中的外观类也是一个单例。一般一个工程中只需你自己继承该Facade类并实现自己的一个外观类就可以了,并不需要实现多个。

下面就看下ooc-lang的代码:

/*
 *	Facade.ooc
 *	外观层
 */

// 相关模块的引入
import interfaces/[IFacade, ICommand, INotifier]
import core/[Controller, Model, View]
import patterns/observer/Notification
import patterns/proxy/Proxy
import patterns/mediator/Mediator

// Facade自身也可以发通知的,所以继承了INotifier,
Facade: class extends INotifier implements IFacade {
	// 这三个变量用来保存MVC三层的单例引用,这样就不用每次都调用它们获取单例的函数了
	controller: Controller
	model: Model
	view: View

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

	SINGLETON_MSG := "Facade Singleton already constructed!"

	// 构造函数
	init: func {
		if (instance != null) {
			Exception new(SINGLETON_MSG) throw()
		}
		"[ Facade ] new()" println()
		instance = this
		initializeFacade()
	}

	// 初始化
	initializeFacade: func {
		"[ Facade ] initializeFacade()" println()

		initializeModel()
		initializeController()
		initializeView()
	}

	// 获取类的唯一实例
	getInstance: static func -> Facade {
		if (This instance == null) {
			This instance = Facade new()
		}
		return This instance
	}

	// 获取Controller的单例
	initializeController: func {
		if (controller != null) {
			return
		}
		"[ Facade ] initializeController()" println()

		controller = Controller getInstance()
	}

	// 获取Model的单例
	initializeModel: func {
		if (model != null) {
			return
		}
		"[ Facade ] initializeModel()" println()

		model = Model getInstance()
	}

	// 获取View的单例
	initializeView: func {
		if (view != null) {
			return
		}
		"[ Facade ] initializeView()" println()

		view = View getInstance()
	}

	// 封装Controller层的注册命令的方法
	registerCommand: func(notificationName: String, command: ICommand) {
		"[ Facade ] registerCommand() #{notificationName}" println()

		controller registerCommand(notificationName, command)
	}

	// 封装Controller层移除命令的方法
	removeCommand: func(notificationName: String) {
		"[ Facade ] removeCommand() #{notificationName}" println()

		controller removeCommand(notificationName)
	}

	// 封装Controller层查询命令的方法
	hasCommand?: func(notificationName: String) -> Bool {
		controller hasCommand?(notificationName)
	}

	// 封装Model层注册代理的方法
	registerProxy: func(proxy: Proxy) {
		"[ Facade ] registerProxy() #{proxy getProxyName()}" println()

		model registerProxy(proxy)
	}

	// 封装Model层获取代理的方法
	retrieveProxy: func(proxyName: String) -> Proxy {
		"[ Facade ] retrieveProxy() #{proxyName}" println()

		model retrieveProxy(proxyName)
	}

	// 封装Model层移除代理的方法
	removeProxy: func(proxyName: String) -> Proxy {
		"[ Facade ] removeProxy() #{proxyName}" println()

		proxy: Proxy
		if (model != null) {
			proxy = model removeProxy(proxyName)
		}
		return proxy
	}

	// 封装Model层查询代理的方法
	hasProxy?: func(proxyName: String) -> Bool {
		model hasProxy?(proxyName)
	}

	// 封装View层注册中介的方法
	registerMediator: func(mediator: Mediator) {
		"[ Facade ] registerMediator() #{mediator getMediatorName()}" println()

		if (view != null) {
			view registerMediator(mediator)
		}
	}

	// 封装View层获取中介的方法
	retrieveMediator: func(mediatorName: String) -> Mediator {
		"[ Facade ] retrieveMediator() #{mediatorName}" println()

		view retrieveMediator(mediatorName)
	}

	// 封装View层移除中介的方法
	removeMediator: func(mediatorName: String) -> Mediator {
		"[ Facade ] removeMediator() #{mediatorName}" println()

		mediator: Mediator
		if (view != null) {
			mediator = view removeMediator(mediatorName)
		}
		return mediator
	}

	// 封装View层查询中介的方法
	hasMediator?: func(mediatorName: String) -> Bool {
		view hasMediator?(mediatorName)
	}

/*
	// 该方法已在INotifier中实现,而Facade类继承了它,所以这里不需要了
	// 官方AS3版是有的
	sendNotification: func(notificationName: String, body: Pointer, type: String) {
		notifyObservers(Notification new(notificationName, body, type) as INotification)
	}
*/

	// 封装View层通知观察者的方法
	notifyObservers: func(notification: Notification) {
		"[ Facade ] notifyObservers() #{notification getName()}" println()

		if (view != null) {
			view notifyObservers(notification)
		}
	}
}

整个Facade类就这样,只是封装接口,具体接口的说明可以看前一篇文章介绍。整个PureMVC框架就讲完了,当然,这不是最后一篇,下一篇会讲个小例子演示一下,也是用ooc-lang实现的。

这篇的内容有点少,Facade本身就不复杂,权当是贴出代码来看看了。

你可能感兴趣的:(PureMVC框架)