引言
上篇文章,我们分析了pureMVC的结构以及工作流。从本文开始,将逐个解剖其中设计到的设计模式。我们先看facade模式和singleton模式。
一、pureMVC中的Facade模式
1. facade模式介绍
Façade模式的理论基础是迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD. Façade模式体现了这一点。GoF中对facade模式的定义是,为子系统定义一个高层接口,使得对子系统的使用更加容易。引入façade模式的基础,是OO设计中经常会把一个功能比较大的系统分成若干个子系统以降低复杂性。但随之而来的问题是,很多子系统是的客户在调用的时候需要知道很多的细节,使用不便。于是很自然的,想到用一个辅助类(facade),来提供更高层的基于语义/功能的接口。这种模式façade模式。如图1所示,客户1,2,3原来要分别同几个系统同时交互,而引入facad模式后,客户只要同façade交互就可以了,降低了耦合度。
图1. Façade模式
Façade模式在需要降低客户程序对多个子系统及其实现的高度耦合中非常有用。
a. 当要为复杂的子系统提供简单统一的结构时使用,不必担心子系统由于各种原因演变而越来越复杂。而那些需要更多功能的客户则可以无视façade,直接去访问各个子系统,实现更高级的功能。
b. 接触客户和抽象类具体实现的依赖关系。通过façade接口,客户无需知道是那个具体的实现类在为其服务,是的系统的维护性和一致性增强。这一点在pureMVC中体现的比较明显。
Façade的协作过程很简单,两步走:
第一步,客户对facade发起请求。
2 pureMVC中的facade
图2. Façade接口
pureMVC中有一个名为façade的package,明确指出使用的是façade模式。图2是façade接口中的所有函数。从成员函数很容易看出,façade类包括了对MVC中所有部件的操作,比如Model使用的proxy在这里进行注册和删除(registerProxy/removeProxy等),Controller使用的command在这里提供操作函数(registerCommand/removeCommand等),以及View需要的mediator也在这里操作(registerMediator/removemediator等)。除此之外,façade还提供对事件的控制接口,notifyObserver接口可以将该之间(INotification)发送出去。通过时间循环,对该事件感兴趣的observer都会收到通知。其中的细节我们会在observer模式中仔细分析。
- protected Facade()
- {
- initializeFacade();
- }
- /**
- * Initialize the Multiton <code>Facade</code> instance.
- *
- * <P>
- * Called automatically by the constructor. Override in your
- * subclass to do any subclass specific initializations. Be
- * sure to call <code>super.initializeFacade()</code>, though.</P>
- */
- protected void initializeFacade( )
- {
- initializeModel();
- initializeController();
- initializeView();
- }
- protected void initializeController()
- {
- if( controller != null )
- return;
- controller = Controller.getInstance();
- }
- protected void initializeModel()
- {
- if( model != null )
- return;
- model = Model.getInstance();
- }
- protected void initializeView()
- {
- if( view != null )
- return;
- view = View.getInstance();
- }
控制协作看,看下面两个代码片段:
- public void registerCommand( String noteName, ICommand command )
- {
- controller.registerCommand( noteName, command );
- }
- public void notifyObservers( INotification note )
- {
- if( view != null)
- view.notifyObservers( note );
- }
可以说,pureMVC这里的facade模式实现的干净漂亮,是一个很好的范例。以后的系统设计中,可以借鉴。
二、pureMVC中的singleton模式
1. singleton 模式介绍
2. pureMVC中的单例
- public class Model implements IModel
- {
- /**
- * Singleton instance
- */
- protected static Model instance;
- protected Map<String, IProxy> proxyMap;
- protected Model()
- {
- instance = this;
- proxyMap = new HashMap<String, IProxy>();
- initializeModel();
- }
- protected void initializeModel( )
- {
- }
- public synchronized static Model getInstance()
- {
- if( instance == null)
- instance = new Model();
- return instance;
- }
- ......
- }
三、总结:
另一方面,framework中的组件都是经过良好设计的,他们之间都是的交互也是良好定义的。他们在系统中一般应该也只应该出现一次,这是singleton的经常在framework中出现的语义基础。比如MFC框架中的theApp,便是一个整个app框架的singleton。
转自:http://blog.csdn.net/cpfeed/article/details/7391048