上一篇这里描写叙述了一个关于差异数据在开发过程中的一个长处,这里来演示另外一个特点:单机开发之无缝切换到C/S模式

一般C/S模式都面临一个问题:

就是开发过程中的调试难题,由于涉及到client和服务端相关方法,假设由某个人来编写那么也是一个简单的事情.

假设由2个人编写,会带来一些平台上的差别以及编码的差别.

简单的说,假设我们在开发时全然的避开C/S,然后经由某个机制,能够直接让模块跑到server上,那么这将让你的开发速度上升好几个倍率.

没有协议,没有交互,没有网络,那么从头写到尾,也是一件比較简单的事情了,无需专门的服务端主程了(貌似哥们要失业了....><...).

首先来说一下,结合差异化网络数据交互方式的开发模式,比較绕口.

从模式上说,传统的MVC模式比較类似.

1.Model层,定义并描写叙述了整个场景,细化到每个数据对象,HP,MP之类

2.View(UI)层,

2.1把相应的数据绑定到UI上某个显示元素,当这个数据改动的时候,刷新UI上的数据.

2.2当用户激活某个控件,发出一条命令,而且当命令响应后,运行相应的回调方法

3.Control层, 相应应用层的逻辑,比方改动了某个数值

这就是本地单机开发的模式,然后就是本文的重点了,怎样把单机模式切换到C/S模式.

參考之前的文章,如果了2个Model之间的同步问题,

那么把M/C 2层复制到服务端,然后通过同步协议同步本地的Model和远程的Model,就切换成功了.

来看下远程流程:

UI->本地Model->发出命令,等待回调->发送到远程->远程运行命令->改动远程Model->获得返回值和差异数据->

->本地Model 通过返回值和差异数据 同步->激活UI改动事件,改动绑定UI元素->运行回调

单机开发流程:

UI->本地Model->发出命令,等待回调->运行命令->改动Model->激活UI改动事件,改动绑定UI元素->运行回调

只在运行之前和回调进行一层简单的桥接,那么就可以切换到C/S模式.

这边贴上一个演示样例,关于代理层和实际控制层的差别

    public class Model : System.ComponentModel.INotifyPropertyChanged
{
private string _name = null; private int _count = 0; public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
} public int Count
{
get { return _count; }
set
{
if (_count != value)
{
_count = value;
OnPropertyChanged("Count");
}
}
} public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
} /// <summary>
/// 实际控制类
/// </summary>
public class ModelControl : Model
{ public virtual void ChangeName(string name, Action callback)
{
this.Name = name; if (callback != null)
{
callback();
}
} public virtual void ChangeCount(int count, Action callback)
{
this.Count = count; if (callback != null)
{
callback();
}
}
} /// <summary>
/// 代理类
/// </summary>
public class RemoteModelControl : Model
{ public void ChangeCount(int count, Action callback)
{
RemoteCall.BuildRequest(callback, "ChangeCount", count,null);
} public void ChangeName(string name, Action callback)
{
RemoteCall.BuildRequest(callback, "ChangeName", name, null);
}
}

最新文章

  1. ASP.NET MVC 解析模板生成静态页一(RazorEngine)
  2. es6 import export 与 node 中的module.exports exports
  3. typedef 和define的区别
  4. To Do List
  5. Orcle基本语句(一)
  6. mysql导入数据出错
  7. html颜色字体字符代码
  8. Myeclipse如何改变编码方式
  9. Xcode6编译SDWebImage报错解决方法(SDWebImageDownloaderOperation.m错误)
  10. Netbeans7.0完美中文+Consolas字体显示配置(亲测可用)
  11. for循环、穷举法和迭代
  12. ogg的孩子-无损音频编解码flac
  13. Exception: &#39;dlib.mmod_rectangle&#39; object has no attribute &#39;right&#39; - 例外:&#39;dlib.mmod_rectangle&#39;对象没有属性&#39;right&#39;
  14. Vue-input框checkbox强制刷新
  15. npm install出现"Unexpected end of JSON input while parsing near"
  16. 通过adb启动app应用
  17. JS图片验证码
  18. L3-020 至多删三个字符 (30 分) 线性dp
  19. mysql-master-ha 实现mysql master的高可用。
  20. IOS Xib使用——为控制器添加Xib文件

热门文章

  1. Nearest Neighbor Search
  2. 动态规划:部分和问题和数字和为sum的方法数
  3. Android背后的设计思想——功能共享机制
  4. Ubuntu14.04 安装中文输入法
  5. 二、python的逻辑运算与数据类型
  6. PAT甲级1095. Cars on Campus
  7. JS取整,四舍五入,取绝对值等Math对象常用方法
  8. 浅谈JVM-类加载器结构与双亲委派机制
  9. ELM327 OBD to RS232 Interpreters
  10. react的传值类型PropTypes简单说明