[框架]PureMVC--Facade/通知源码

Posted ouyangshima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[框架]PureMVC--Facade/通知源码相关的知识,希望对你有一定的参考价值。

Façade

MVC 元设计模式的核心元素在 PureMVC 中体现为 Model 类、View 类和
Controller 类。为了简化程序开发,PureMVC 应用了 Façade 模式。
Façade 是 Model、View 和 Controller 三者的“经纪人”
。实际编写代码时你
并不用导入这三者的类文件,也不用直接使用它们。Façade 类已经在构造方法包含了对核心 MVC 三者单例的构造。
一般地,实际的应用程序都有一个 Façade 子类,这个 Façade 类对象负责初始
化 Controller(控制器),建立 Command 与 Notification 名之间的映射,并执
行一个 Command 注册所有的 Model 和 View。

module puremvc 
    //持有核心层的mvc,把mvc中的接口集合在一起,形成了外观模式
    export class Facade implements IFacade 
        model: IModel = null;//接口有4个注册、注销、获取、判定有无
        view: IView = null;//同上
        controller: IController = null;//3个接口,注册、注销、获取
        constructor() 
            if (Facade.instance)
                throw Error(Facade.SINGLETON_MSG);
            Facade.instance = this;
            this.initializeFacade();
        
        initializeFacade(): void 
            this.initializeModel();
            this.initializeController();
            this.initializeView();
        
        initializeModel(): void 
            if (!this.model)
                this.model = Model.getInstance();
        
        initializeController(): void 
            if (!this.controller)
                this.controller = Controller.getInstance();
        
        initializeView(): void 
            if (!this.view)
                this.view = View.getInstance();
        
        registerCommand(notificationName: string, commandClassRef: Function): void 
            this.controller.registerCommand(notificationName, commandClassRef);
        
        removeCommand(notificationName: string): void 
            this.controller.removeCommand(notificationName);
        
        hasCommand(notificationName: string): bool 
            return this.controller.hasCommand(notificationName);
        
        registerProxy(proxy: IProxy): void 
            this.model.registerProxy(proxy);
        
        retrieveProxy(proxyName: string): IProxy 
            return this.model.retrieveProxy(proxyName);
        
        removeProxy(proxyName: string): IProxy 
            var proxy: IProxy;
            if (this.model)
                proxy = this.model.removeProxy(proxyName);
            return proxy
        
        hasProxy(proxyName: string): bool 
            return this.model.hasProxy(proxyName);
        
        registerMediator(mediator: IMediator): void 
            if (this.view)
                this.view.registerMediator(mediator);
        
        retrieveMediator(mediatorName: string): IMediator 
            return this.view.retrieveMediator(mediatorName);
        
        removeMediator(mediatorName: string): IMediator 
            var mediator: IMediator;
            if (this.view)
                mediator = this.view.removeMediator(mediatorName);
            return mediator;
        
        hasMediator(mediatorName: string): bool 
            return this.view.hasMediator(mediatorName);
        
        //通知观察者,就是单例view调用传参,(通过通知名来获取所有观察者对象Observer)
        notifyObservers(notification: INotification): void 
            if (this.view)
                this.view.notifyObservers(notification);
        
        //发送通知
        sendNotification(name: string, body: any = null, type: string = null): void 
            this.notifyObservers(new Notification(name, body, type));
        
        static SINGLETON_MSG: string = "Facade singleton already constructed!";
        static instance: IFacade;
        static getInstance(): IFacade 
            if (!Facade.instance)
                Facade.instance = new Facade();
            return Facade.instance;
        
    

通知(发送者、接收者、通知体)

module puremvc 
    //通知体
    export class Notification implements INotification 
        name: string = null;//通知名
        body: any = null;//通知内容
        type: string = null;//通知类型
        constructor(name: string, body: any = null, type: string = null) 
            this.name = name;
            this.body = body;
            this.type = type;
        
        getName(): string 
            return this.name;
        
        setBody(body: any): void 
            this.body = body;
        
        getBody(): any 
            return this.body;
        
        setType(type: string): void 
            this.type = type;
        
        getType(): string 
            return this.type;
        
        toString(): string 
            var msg: string = "Notification Name: " + this.getName();
            msg += "\\nBody:" + ((this.getBody() == null) ? "null" : this.getBody().toString());
            msg += "\\nType:" + ((this.getType() == null) ? "null" : this.getType());
            return msg;
        
    



module puremvc 
    //通知发送者
    export class Notifier implements INotifier 
        facade: IFacade = null;//是通过单例facade来发送消息的
        constructor() 
            this.facade = Facade.getInstance();
        
        sendNotification(name: string, body: any = null, type: string = null): void 
            this.facade.sendNotification(name, body, type);
        
    


module puremvc 
    //通知观察者/接收者,对回调函数进行了一层封装
    export class Observer implements IObserver 
        notify: Function = null;//回调函数
        context: any = null;//回调函数的上下文
        constructor(notifyMethod: Function, notifyContext: any) 
            this.setNotifyMethod(notifyMethod);
            this.setNotifyContext(notifyContext);
        
        private getNotifyMethod(): Function 
            return this.notify;
        
        setNotifyMethod(notifyMethod: Function): void 
            this.notify = notifyMethod;
        
        private getNotifyContext(): any 
            return this.context;
        
        setNotifyContext(notifyContext: any): void 
            this.context = notifyContext;
        
        notifyObserver(notification: INotification): void 
            this.getNotifyMethod().call(this.getNotifyContext(), notification);
        
        compareNotifyContext(object: any): bool 
            return object === this.context;
        
    

源码puremvc-typescript-standard-framework

以上是关于[框架]PureMVC--Facade/通知源码的主要内容,如果未能解决你的问题,请参考以下文章

「开源」springboot快速开发框架推荐,接私活利器

SpringCloud 微服务架构,适合接私活(附源码)

SpringCloud 微服务架构,适合接私活(附源码)

曝光1套支付系统源码,可快速2次开发接私活!

JDK日志框架源码分析

曝光1套支付系统源码,可快速2次开发接私活!