复合设计模式—MVC

    技术2025-03-28  13

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

     

    最新回复(0)