这是我参与「第四届青训营 」笔记创作活动的第5天
软件构件是用来组装的单元、具有约定好的接口、有自己的工作条件即显式的上下文依赖、可以被第三方使用者独立部署。使用低耦合且相互独立的构件组装成复杂的软件系统,从而提升系统开发效率降低开发成本维护程序的持续演化,作为构件者只需了解接口的API而不需要从零开发。
如我们在开发一个应用时可以使用基于构件开发的思想:main函数启动即部署好了一个服务器,我们写的代码部分就是完成用户请求业务逻辑的部件,针对用户不同请求做出响应;模板引擎部件负责对需求代码做进一步的功能封装;安全访问控制模块可以增加用户名密码登陆验证等功能;链接到数据库。框架负责对所有构件进行管理和封装,控制各个类的关系交互。组件之间的关系像是一幅拼图。
Inversion of Control 反转控制(依赖注入),组件之间的依赖关系在运行时才会被确定而不需要提前写定在代码里,由第三方外部实体(Assembler组装器)决定而不是使用者自己决定(强相关)。每个类自己定义set方法得到所需要注入的组件,即先获得最基础的构件,再完成由基础构件拼接注入而成的二级模块的组装,最后根据组件和配置信息完成整个系统的组织。
eg.
public class MovieLister {
private MovieFinder movieFinder;
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
public void listMovies() {
this.movieFinder.get().findMovies(...);
}
// ...
}
public class MovieFinderImpl implements MovieFinder { }
MovieLister使用MovieFinder但不自己创建,由Assembler创建一个MovieFinder的实现对象传递给
MovieLister使用,即把一个MovieFinder注入到MovieLister(类似工厂模式思想)。具体可通过set方法或构造方法中得到一个符合当前上下文的MovieFinder实体。