画布 1
架构模式
  MVC
    组成
      Model（模型）：封装与应用程序的业务逻辑相关的数据以及对数据的处理方法
        核心组件
      View（视图）：负责数据的展示
      Controller（控制器）：M和V之间的连接器，用于控制应用程序的流程。接受用户输入，将其转换为命令给M或V
        把View的请求转发给Model
        把Model处理结束的消息通知View
    分类
      主动MVC：Model主动通知View更新，View事先在被它监视的数据那里订阅Model的事件
      被动MVC：Controller负责通知View更新
        模型对视图和控制器一无所知，它仅仅是被它们使用
        控制器使用视图，并通知它更新数据显示
        View仅在Controller通知它的时候才去Model取数据
    优点
      同时开发，提高开发效率
      耦合性低
      高内聚：MVC使相关联的逻辑动作组合在一个控制器中。 特定模型的视图也分组在一起。
      职责分离，可维护性好
      同一Model可有多个View
    缺点
      代码导航 - 框架导航可能很复杂，因为它引入了新的抽象层，并且要求用户适应MVC的分解标准
      没有考虑到View端的复杂性，Model难以符合复杂多变的View端变化
    应用
      Smalltalk
      Asp.Net MVC
  MVP
    组成
      Model（模型）
      View（视图）：V代表的是一个接口，将UI界面提炼而抽象出来的接口。View 非常薄，不部署任何业务逻辑，称为"被动视图"（Passive View）
      Presenter：M和V的桥梁，负责将对应的Model和View组合到一起，View 与 Model 不发生联系，都通过 Presenter 传递
    优点
      模型与视图完全分离，我们可以修改视图而不影响模型
    应用
      Windows Forms
  MVVM
    组成
      Model（模型）
      View（视图）：和ViewModel匹配
      ViewModel（Model for View）：Model改变时更新对应的所有View，可看做是观察者模式
    应用
      Silveright
      WPF
      HTML5 with Knockout/AngularJS
    采用双向绑定（data-binding）：View的变动，自动反映在 ViewModel
  ECS（Entity-Component System，实体组件系统）
    World/Scene
      Entity：就是一个ID，这个ID对应了组件(Component)的集合，场景中的一切皆是Entity。实体的行为在运行时可以通过addComponent和removeComponent改变
        好处
          用ID指代实体（而不是用指针）具有更好的鲁棒性，实体销毁时不会留下野指针
          对外部保存状态有帮助，重载这些保存的状态时可以不用重新构建指针。
          内存中的数据可以按需排列
          ID可以直接用于夸网络通信指代实体
      Component：描述物体的一个切面（aspect）。仅有状态，不包含行为
      System：每个系统都连续运行（好像每个系统都有自己的私有线程），并在每个拥有与该系统相同切面的实体上执行全局操作。有行为但是没有状态。
    坏处
      系统间的数据传输常常需要设置标志位，维护这些标志位是十分影响效率的
        解决方案：使用观察者模式
      每个系统遍历需处理的实体时由于实体数量庞大而效率低下
        解决方案：合理的划分实体列表，每个系统更新对应的实体列表，反而有利于数据局部性减少缓冲不命中。
    好处
      安全简单的依赖关系。没有复杂的继承树
      良好的可组合性。可以利用现有组件拼凑出新的功能，提高复用率
    遵循组合大于继承原则，消除了继承结构又深又广时难以扩展和维护的问题。多用于游戏开发
  解决业务逻辑和视图之间的耦合