0%

MVC

MVC模式

即:Model-View-Controller模式,用于分层开发。

  • Model:一个存取数据的对象或POJO,可以有逻辑,在数据变化时更新控制器
  • View:数据可视化
  • Controller:作用于Model和View,控制数据流向Model,在数据变化时更新View。

MVVM模式

Model-View-ViewModel即“数据模型|数据 双向绑定”
是一种MVC的改进版。其中的ViewModel就是将View的行为抽象化。VM取出Model中的数据同时处理View中的逻辑。
即:View绑到VM,VM和Model通讯,使其更新以相应UI。如果不涉及持久化,可以变为VVM
其特点为:

  • 低耦合:View和Model可以单独改变
  • 复用性:多个View复用同一ViewModel
  • 独立开发:开发者专注于逻辑和数据(ViewModel),设计人员只做设计,生成xaml代码。
  • 可测试:针对ViewModel编写测试代码。

View

部署页面

fxml

页面设置

viewcontroller

控制页面内逻辑,如鼠标选择。
弹出窗口处理某个对象时,调用mainApp的方法传入对象。
处理后如果页面有相关信息,处理之。处理的方法在此controller中。

mainApp

主进程

反复MVC

第一种,在fx中,view只有布局,controller则控制view中的每个组件,Model在main中指定,在controller中,指定model和view的监听关系,但是移植这一套到swing时,问题很多:

  • fx中view是fxml实现的,swing需要用代码布局,这样必须把组件直接放进view
  • swing不提供原始监听,需要javaBeans或自定义监听。
  • fx中没有指定controller对应的view,但swing中,如果不指定,就完全无法控制

第二种:

  • Model:定义在main中
  • View:定义在main中
  • Controller=new Controller(model,view)

那么,逻辑变为:

  • model需要提供监听接口
  • view定义所有组件和布局,最后把自己交出去由controller控制
  • controller负责为view指定行为和监听model。

注意:

  • 在这种情况下,每个view对应一组mvc,这三个组件都是在 main中定义的。
  • 那么,你不需要在view中使用controller
  • controller的构造函数需要实现view的初始化,注意,不是构造,二者应该分开,其区别是,页面在构造时生成,页面需要动态设定值的部分由init设置。
  • 在controller中不仅需要view的init,也要controller的init,controller的init用于指定逻辑。
  • initController在main调用。
  • view需要将自己的属性用getter提供给controller
  • 不要忘记给controller以main的引用
  • 需要把view分解为,ui,数据,逻辑分别在view,initView和initController
    那么:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    //javaBean
    public class Model {

    }
    //**********
    public view extends panel{
    private ...
    private ...
    view(){

    }
    }
    //*********
    public controller {
    private main;
    private view;
    private model;
    public controller(view,model){

    }
    public initView(){
    view.
    }
    public initController(){
    model.
    view.
    }
    }
    main(){
    view..
    model..

    Actions..
    controller=new controller(model,view)
    controller.init
    }