数据共享问题--还是MVC

原创 2007年09月21日 09:53:00
        以前在使用VC的时候,常常会看到Document/View的模型。那时候就知道他是MVC的一个变种。后来不断的看到有人MVC。但是其实我一直没有具体体会过MVC的好处。因为我们很少会重新设计界面或者重新实现数据模型。我们做的都是具体项目。不是产品也不是通用工具。
        但是 最近的项目中就遇到了一个问题。仔细想了一下发现这就是MVC的一个经典应用。我们通常认为MVC中的V是视图,这是大家都知道的。但是还有一个误解那就是V表示界面。这个误解常常使得我在设计系统的时候想不起MVC来。现在终于要改变这个观念了。V其实就是M的客户端而已。
        具体的问题是这样的。在我们的系统中每个图层上的对象都有一个属性是需要程序自动填上去的。因为我们做的编辑器是一个通用图形编辑器。在用户建立和修改图形的时候能够按照业务规则自动的给对象添上一些必要的属性。这个规则是可以配置的。现在问题就是,当用户在编辑的过程中,修改了规则或者添加了新规则。我们的编辑器是感觉不到这个规则的变化的。
        在开始编辑的时候,系统会把业务规则传递给编辑器使用。在其它地方就没有修改编辑器中业务规则的方式了。但是在我们的用户界面中有一个修改业务规则的界面。用户是可以在任何时候修改业务规则的。当然修改有就不能够立即其作用。我以前为了解决这个问题给编辑器添加了一个功能那就是刷行配置信息。这回导致所有的配置信息被重新载入。当然业务规则也会被重新载入。这样不久更新了吗。
        今天再仔细想了一下,我认为这两个控件都是我自己编写的并没有第三方库介入。为什么要使用这样一种不自然的方式来桥接这两个系统呢?
        于是我想到了让这两个控件共享同一个数据对象(里面是业务规则)。有用户界面的那个是可以编辑该对象的客户端。而编辑器则是一个只读取不修改的客户端。于是这个问题就解决了。不管什么时候用户修改了业务规则,在编辑器中都能马上反应出来。因为编辑器不在缓存规则而是直接引用。
       作到这一步我才发现这就是一个典型的MVC模型。
    
public interface EditorLayerObjects
    
...{
        
int LayerCount...{get;}
        EditLayerObject GetLayerAt(
int pIndex);
        EditLayerObject GetLayerOf(
string pClassName);
        
int IndexOfLayer(EditLayerObject pLayerObject);
        
void AppendLayer(EditLayerObject pLayerObject);     
        
void AppendLayer(ICollection pLayerObjectCol);
        
void RemoveLayer(EditLayerObject pLayerObject);
        
void ClearLayer();
    }
    上面是数据模型的接口。
    原先的编辑器自己实现了这个接口
  
public class DefaultEditor:EditorObject
...{
  
其他代码#region 其他代码
  
#endregion

    
EditorLayerObjects 成员#region EditorLayerObjects 成员
        
private void UpdateLayerObjectList()
        
...{
            
//这个函数用来检查LayerObject列表中的LayerObject是否都可用。
            if(this.ActiveView !=null)
            
...{
                
                
int aLayerCount=this.EditorLayerObjectList .Count ;
               
for(int li=0;li<aLayerCount;li++)
                
...{
                   EditLayerObject aObject
=this.EditorLayerObjectList [li] as EditLayerObject;
                   
if(aObject==nullthis.EditorLayerObjectList .Remove(aObject);
                    IGeoFeatureLayer aLayer
=LayerHelper.QueryLayerByModelName (
                        
this.ActiveView .FocusMap ,aObject.ClassName )as IGeoFeatureLayer ;
                   
if(aLayer!=null)
                   
...{//找到图层后就使用
                       aObject.ObjectLayer =aLayer;
                   }

                   
else
                   
...{//对于找不到图层的现在就直接去掉了。
                       this.EditorLayerObjectList .Remove (aObject);
                   }

                }

              
            }

        }

        
private ArrayList m_layerObjectList;
        
private ArrayList EditorLayerObjectList
        
...{
            
get
            
...{
                
if(this.m_layerObjectList ==null)
                    
this.m_layerObjectList =new ArrayList ();
                
return this.m_layerObjectList ;
            }

        }

        
public int LayerCount
        
...{
            
get
            
...{
                
return this.EditorLayerObjectList.Count ;
            }

        }

        
public EditLayerObject GetLayerAt(int pIndex)
        
...{
            
return this.EditorLayerObjectList [pIndex] as EditLayerObject;
        }

        
public EditLayerObject GetLayerOf(string pClassName)
        
...{
            
if(pClassName==null)return null;
            pClassName
=pClassName.ToUpper ();
            
int lCount=this.LayerCount ;
            EditLayerObject rLayer
=null;
            EditLayerObject aLayer
=null;
            
for(int li=0;li<lCount;li++)
            
...{
                aLayer
=this.GetLayerAt (li);
                
if(aLayer.ClassName .Equals(pClassName))
                
...{
                    rLayer
=aLayer;
                    
break;
                }

            }

            
return rLayer;
        }

        
public int IndexOfLayer(EditLayerObject pLayerObject)
        
...{
            
return this.EditorLayerObjectList .IndexOf (pLayerObject);
        }

        
public void AppendLayer(EditLayerObject pLayerObject)
        
...{
            
if(pLayerObject!=null)
            
...{
                
string aClassName=pLayerObject.ClassName ;                
                
if(this.ActiveView !=null)
                
...{//如果存在ActiveView 那么查询一下对应的图层。
                    
//只有有对应图层的对象才会保存下来。
                    ILayer aLayer=LayerHelper.QueryLayerByModelName (this.ActiveView.FocusMap ,aClassName);
                    
if(aLayer!=null)
                        pLayerObject.ObjectLayer 
=aLayer as IGeoFeatureLayer ;
                    
this.EditorLayerObjectList .Add (pLayerObject);
                }

                
else...{
                    
//由于目前没有ActiveView,所以先全部加入。在开始编辑的时候
                    
//和设置ActiveView的时候再查询一下。
                    this.EditorLayerObjectList .Add (pLayerObject); 
                }
       
            }

        }

        
public void AppendLayer(ICollection pLayerObjectCol)
        
...{
            
foreach(EditLayerObject aObject in pLayerObjectCol)
            
...{
                
this.AppendLayer (aObject);
            }

        }

        
public void RemoveLayer(EditLayerObject pLayerObject)
        
...{
            
this.EditorLayerObjectList .Remove (pLayerObject);
        }

        
public  void ClearLayer()
        
...{
            
this.EditorLayerObjectList .Clear ();
        }

        
#endregion

}
  后来修改了EditLayerObjects 添加了一个函数
public interface EditorLayerObjects
    
...{
        
void AttachModel(EditorLayerObjects pLayerObjects);
        
int LayerCount...{get;}
        EditLayerObject GetLayerAt(
int pIndex);
        EditLayerObject GetLayerOf(
string pClassName);
        
int IndexOfLayer(EditLayerObject pLayerObject);
        
void AppendLayer(EditLayerObject pLayerObject);     
        
void AppendLayer(ICollection pLayerObjectCol);
        
void RemoveLayer(EditLayerObject pLayerObject);
        
void ClearLayer();
    }
      这个方法允许对接口将自己的函数调用转发给另外一个挂接对象。
     于是这样就可以将那个编辑EditorLayerObjects的用户界面中对EditorLayerObjects的实现挂接到编辑器的EditorLayerObjects上。这样二者就自动地实现了数据共享。

MVC原理和MVC模式的优缺点

mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。...
  • u011877416
  • u011877416
  • 2013年10月26日 09:10
  • 8638

MVC基础入门——最基础小例子

Mvc在学习《Headfirst》的时候,就接触过了。对于这个庞大的模式。非常的感兴趣。Mvc就是设计模式的升华。 在没有接触过Mvc的时候,一直都是在使用的三层架构,使用的UBD三层来做项目。对于这...
  • zc474235918
  • zc474235918
  • 2014年11月23日 23:24
  • 2300

为什么使用MVC模式

首先设计模式是前辈们经过无数的实践总结出来的一种便捷,智慧的,经得起考验的标准的工作流程。其次我想讲一下什么是MVC 设计模式,有什么作用以及 为什么要使用它,他解决了什么问题,他有什么优点,缺点?...
  • linhaiguo
  • linhaiguo
  • 2015年12月16日 18:09
  • 3483

HTML5开发中使用MVC模式

很多人一定会说,js开发根本不需要什么MVC,用了就是给自己找麻烦。在这里,我不去讨论需不需要的问题,只是我个人感觉这次的开发使用了MVC模式之后,代码各个模块确实一目了然,维护和扩展都相对方便了许多...
  • lufy_Legend
  • lufy_Legend
  • 2013年11月27日 07:41
  • 15044

Qt mvc学习一

mvc是经典的三层结构,将数据,视图和逻辑分离。Qt中的Model/View框架,实现了这个模式。在Qt中这个模式设计到三个类,model类,view类和delegate类。model类保存数据,vi...
  • zhx6044
  • zhx6044
  • 2013年06月02日 22:32
  • 12328

mvc的运行原理

m代表model模型,v代表view视图,c代表controller,控制器。m中包含你写的业务逻辑,就是取数据的模型,v代表你显示的视图,c来控制m和v之间的关系。mvc的运行原理基本一样没有什么不...
  • u010337889
  • u010337889
  • 2014年09月23日 19:55
  • 970

10个最好的 Node.js MVC 框架

Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序。Node.js 包含不同类型的框架,如 MVC 框架、全栈框架、REST API  以及大量的服...
  • ejinxian
  • ejinxian
  • 2016年09月12日 12:33
  • 824

三层架构与mvc分层

三层         三层架构(3-tierapplication)通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的是为了“高...
  • leimengyuanlian
  • leimengyuanlian
  • 2013年01月23日 16:01
  • 5407

浅谈MVC架构—你到底有什么本事

MVC的处理过程:首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理。然后模型根据用户请求进行相应的业务逻辑处理,并返回数据。最后控制器调用相应的视图格式化模型返回的数据,并通过视图呈现给用户...
  • u010168160
  • u010168160
  • 2015年01月27日 07:58
  • 58274

每日一面试题--MVC思想是什么?

1.认识两个类似的名词! MVP-Backbone.js(model-view-presenter;模型-视图-表现类) MVVM-Knockout.js(model-view-viewmodel...
  • qq_34986769
  • qq_34986769
  • 2016年09月20日 12:48
  • 2580
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据共享问题--还是MVC
举报原因:
原因补充:

(最多只允许输入30个字)