很强大,但让我很头疼的东西,弄懂它!
这个东西无非就是模型-视图-控制器。还有什么——关系,更确切一点就是这三者之间的关系。
首先明确谁能和谁通信:
现在你是一个播放器:我的视图上有按钮,当别人按了播放按钮的时候,这个信号应该传递到控制器,所以视图能向控制器传递信息;这个时候,控制器就应该调用模式里的代码,去播放音乐,所以控制器能向模型传递信息;与此同时,控制器可能将播放按钮变成停止按钮,所以,控制器能向视图传递信息;当模型将音乐放出来之后,它通知视图,音乐已经开始播放,所以模型能向视图传递信息;而视图想要得到歌曲的名字,就要向模型请求这样的信息,所以视图也可以向模型传递信息。
看一个非常非常简单的例子(我自己写的,再简单不过了,注释也说明地比较详细):
视图:
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
//取得数据
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带给我们的是设计上的清晰性,维护上的便捷性。