控制反转
今天听课的时候对于这个概念听的有点云里雾里的,在这里重点解释一下。
反转控制(Inversion of Control,IoC)可以用一个生活中的比喻来理解:
传统模式:你主动控制一切
想象你是一个顾客去餐馆吃饭。在传统模式下,你需要:
自己走到厨房门口喊:“我要点菜!”
盯着厨师做菜,催促他快点。
菜做好了,自己跑去端回来。
整个过程你完全掌控流程,但非常繁琐,且需要全程参与。
反转控制模式:交给“系统”来通知你
而在反转控制模式下:
你坐下来,告诉服务员:“菜做好了叫我一声”。
你不再关心厨师什么时候做菜、怎么通知你。
当菜做好时,服务员主动通知你,你只需处理“端菜”这个动作。
这时,流程的控制权从你(调用者)转移到了服务员(框架/系统)。
对应到代码中的例子
你的按钮监听器代码就是一个典型反转控制的例子:
btnStep.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) { // 系统在按钮点击时自动调用这个方法System.out.println("按下啦!");step();frame.repaint();}
});
传统模式:你需要写一个死循环不断检查按钮是否被点击(比如 while(true) 轮询)。
反转控制:你告诉按钮:“被点击时叫我一声”,然后系统负责在事件发生时触发你的代码。
即其字面意思理解(反转控制):本来正常情况下是由写代码的人来写出相应的控制代码,但现在则是系统帮助你调用控制检测,在恰当的时间告诉你就完了。
内部类
1.在别的类里面的类叫做内部类(是一个内部的成员 )
2.在函数内部的类
有成员的权力:访问其他成员或者成员函数
在这里相当于定义了一个新的类,这个类实现了ActionListener接口
//匿名类btnStep.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e){System.out.println("按下啦!");step();frame.repaint();}});