复合设计模式—MVC

很强大,但让我很头疼的东西,弄懂它!

这个东西无非就是模型-视图-控制器。还有什么——关系,更确切一点就是这三者之间的关系。


首先明确谁能和谁通信:

现在你是一个播放器:我的视图上有按钮,当别人按了播放按钮的时候,这个信号应该传递到控制器,所以视图能向控制器传递信息;这个时候,控制器就应该调用模式里的代码,去播放音乐,所以控制器能向模型传递信息;与此同时,控制器可能将播放按钮变成停止按钮,所以,控制器能向视图传递信息;当模型将音乐放出来之后,它通知视图,音乐已经开始播放,所以模型能向视图传递信息;而视图想要得到歌曲的名字,就要向模型请求这样的信息,所以视图也可以向模型传递信息。

看一个非常非常简单的例子(我自己写的,再简单不过了,注释也说明地比较详细):

视图:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值