Java进阶第七章

Java进阶之控制反转与MVC模式

控制反转

1.我们现在创建图形窗口的这套机制叫作Swing,图形上看到的所有东西都叫做“ 部件 ”,还有一个概念是“ 容器 ”(比如这里的frame),部件放在容器中。容器也是一种特殊的部件,也可以放到另外一个容器中。容器可以管理部件放置的位置,显示大小等等,这些都是通过布局管理器(LayoutManager)来管理的。

2.frame容器默认的布局管理器是BorderLayout(LayoutManager的一种),且BorderLayout把frame分成五个部分,如下图所示:
在这里插入图片描述
所以我们在frame容器中add部件的时候,得通过BorderLayout指定放置的位置,否则会默认放在中间Center那一部分。

代码实例如下:
在这里插入图片描述

3.现在按钮添加进去了,但是按下去没有反应,我们应该如何做才能让程序知道我们按下去了呢?

“ 图形界面按钮按下去到让程序知道 ”这个过程叫作消息机制,java的Swing实现了一个特别的消息机制。首先部件肯定有自己的成员函数可以判断自己被按下去了(比如这里的单步按钮部件),那么怎么才能在按键按下去之后调用我们主逻辑程序里的Step()函数呢? 有两种想法,**第一种:**首先我们不可能在原始的部件类里面修改其成员函数,我们可以另外做一个类作为原始部件类的子类,在这个子类中我们完成按钮按下去的检测,并且调用Step()函数。第二种: 部件类作为一个已经存在的类,它公布一个接口,接口里面只有一个抽象的动作执行函数。任何实现了这个接口的类的对象/变量,可以通过定义的add或remove函数传给或移出部件类,此时部件类就可以通过这个变量/对象来调用这个变量/对象所在类中的成员函数。这件事情就叫做控制反转,也体现了先建立接口再定义类的设计思路。

4.在一个类的内部定义另外一个类(不是类中的函数的内部),则这个被定义的类称作内部类。内部类和外面这个类的成员变量以及成员函数一样都是成员,可以直接调用外面这个类的成员函数、成员变量。

5.内部类还可以去做匿名类(匿名类也是一种内部类,也可以直接调用外面这个类的成员函数、成员变量。)。这里的1是实现了接口的那个类,这一句实现的功能就是创建了这个实现了接口的类的对象传给部件类并且要调用该类中的相关操作函数;2是接口名,3是匿名类:一对方括号里面只有覆盖接口里面抽象函数的成员函数(操作),没有具体的类名等等,2+3就等于1的效果。这个会经常用到。
在这里插入图片描述
在这里插入图片描述
猜测:“ 父类() {匿名类内容} ” 就是“ 子类()”;“ 接口() {匿名类内容} ”就是“ 实现了这个接口的类() ”

6.从上面4、5的例子可以看出内部类可以存在于两个地方,一个是单纯的定义在一个类的内部,一个就是(作为匿名类)定义在一个类中函数的内部。内部类可以访问外部类的任何成员变量、成员函数;但是有一点需要注意的是,第二种内部类的情况,如果要访问函数内部的变量,则只能访问final的变量。

7.**在a类的内部需要调用b类的成员函数则在a类里面必须通过b的变量来调用,那么在a类里面就要有b类的变量的定义过程。**我们之前在Display类和Clock类的时候是在Clock类里面new出了两个Display类的变量,表明创建每一个Clock对象的时候,里面都包含着两个Dispaly对象,因此用new的时候是表示有类之间有包含关系。 也有直接定义未初始化的b类的变量作为成员变量,然后通过构造函数初始化的做法,这样就是单纯创建一个变量来使用,没有包含关系。

MVC设计模式

1.在狐狸与兔子的代码中,Field表示对数据的处理,View负责表现,Cell是接口,体现的设计思路有:数据与表现分离、接口、反转控制;

2.引入MVC设计模式的概念:
在这里插入图片描述

3.接下来再来分析课表程序,其实与狐狸与兔子程序不太一样!!!

==用之前的知识体系来理解:==首先也体现了表现与数据分离的设计理念,也用到了接口,以及反转控制。这里的JTable只是负责数据的显示,只负责表现;JTableModel是JTable定义出来的接口,负责数据的处理,从而有了接口和控制反转的设计概念。 这个程序出现的新东西是对显示出来的界面做了控制,键盘的输入等等,也就是Control。

用新知识来理解: 本程序中JTableModel是M,JTable是V。 首先JTableModel提供了接口可以让让外部对数据进行编辑(因为JTableModel本身就是由JTable,也就是View模块儿,定义出来的一个接口)实现了这个接口的类可以把对象传给JModel,让JModel来显示数据,并且数据更新了JTableModel会及时通知JModel,显示也会及时更新。需要注意一下的是,该课表程序的V和C被合并成为JTable了(并不代表V和C不独立),因为一般也是在图形界面上实现输入嘛,这里的Control也是用JTable调用实现了JTableModel接口的类中的函数来实现的键盘输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值