这个东西无非就是模型-视图-控制器。还有什么——关系,更确切一点就是这三者之间的关系。 首先明确谁能和谁通信: 现在有一个播放器:我的视图上有按钮,当别人按了播放按钮的时候,这个信号应该传递到控制器,所以视图能向控制器传递信息;这个时候,控制器就应该调用模 式里的代码,去播放音乐,所以控制器能向模型传递信息;与此同时,控制器可能将播放按钮变成停止按钮,所以,控制器能向视图传递信息;当模型将音乐放出来 之后,它通知视图,音乐已经开始播放,所以模型能向视图传递信息;而视图想要得到歌曲的名字,就要向模型请求这样的信息,所以视图也可以向模型传递信息。 看一个非常非常简单的例子(我自己写的,再简单不过了,注释也说明地比较详细): 视图: package mymvc; public class MyView { //界面 MyController mycontroller; MyModel mymodel; public MyView(MyController mycontroller,MyModel mymodel){ this.mycontroller = mycontroller; this.mymodel = mymodel; //我们在这里模拟控制了以下这两个事件,而这两个事件又会分别向控制器发送请求,控制器会解析这个请求 //继而向模型发起请求来做具体的处理,这里没有图形界面,但你应该想象有这么一个界面上面有两个按钮: this.getButtonWasPressed(); this.setButtontWasPressed(); this.getButtonWasPressed(); } public void getButtonWasPressed(){ //触发这个动作的时候,视图要向控制器发送一个请求信号 this.mycontroller.get(); } public void setButtontWasPressed(){ //触发这个动作的时候,视图要向控制器发送一个请求信号,这里只是模拟一下设置成100,而你应该想象成 //这是从图形界面输入的数值: this.mycontroller.set(100); } } 模型: package mymvc; public class MyModel { //真正做事情的地方 int da
ta = 0; //取得数据 public int get_data(){ System.out.println("正在返回数据..." + this.data); return this.data; } //设置数据 public void set_data(int value){ this.data = value; System.out.println("数据已经设置为:" + this.data); } } 视图和模型之间的控制器: package mymvc; public class MyController { //控制器 MyView myview; MyModel mymodel; public MyController(MyModel mymodel){ this.mymodel = mymodel; this.myview = new MyView(this,mymodel); } //控制器接收get()信号,它解析这个信号,请求模型的get_data()方法来处理请求 public int get(){ return mymodel.get_data(); } //控制器接收set(int)信号,它解析这个信号,请求模型的set_data(int)方法来处理请求 public void set(int val){ mymodel.set_data(val); } } 这个例子很简单,让我们看看他们都进行了哪些通信: 首 先,我们在视图“建立”的时候我们“按下了”获得数据的按钮,这个时候进行了视图向控制器传递信号的通信;继而控制器解析这个信号,知道你要获得数据,于 是它向模型发起了请求做具体的处理。剩下的两个也是同样的处理过程,由于例子很简单,所以其它的通信路径没有模拟,可以自己做一下。 现在我们分析一下这样做的好处。、 1。 我们想换一个视图,那怎么办?想要把MyView换成YourView。很简单,你可以在你的视图上加上不同风格的按钮或者其他图片之类的东西,然后加上 一个获得数据的按钮,一个输入框,一个设置数据的按钮;然后获得数据的按钮加入事件,按下时向控制器的get()请求办事情;同样的设置数据时先取得输入 框中的数据,然后以这个数据为参数向控制器的set方法请求办事。最后,你只要在控制器里改一个地方:将MyView改成YourView。这一切都是分 离的! 2.我们具体的处理想换一中实现方式。我管你想换成什么方式,你只要给我留下我需要的接口就可以了,随你怎么改,反正你只要把事情给我办好就OK了。具体的实现是独立的! 3如果想加功能,减功能,从控制器来就是了。如果想使获得数据的功能去掉。很好,只要删除相应的方法,或者改成一个空的实现就可以了。 所以,总的来说MVC带给我们的是设计上的清晰性,维护上的便捷性。