============ 面向接口编程 ============ 多态:一个父类/接口类型的引用可以指向任何子类/实现类类型的对象。 ________________________________ |ProductService |接口| |--------------------------------| |List queryProducts() | |________________________________| | | ________________________________ | |ProductServiceHotSelling |实现类| | |--------------------------------| |__|List queryProducts() { | | | 查询热销商品 | | |} | | |________________________________| | | ________________________________ | |ProductServiceTopRated |实现类| | |--------------------------------| |__|List queryProducts() { | | 查询好评商品 | |} | |________________________________| ^ Service层 ------------------|---------------------------- ___________________________________ 控制层 |ProductServlet | |-----------------------------------| |ProductService productService = | / 侵入性 | new ProductServiceHotSelling();| < 强依赖 |List products = | \ 高耦合 | productService.queryProducts();| |___________________________________| ^ ------------------|---------------------------- __________ 视图层 | | | 商品列表 | |__________| 如何降低控制层对Service层的耦合度? ________________________________ |ProductService |接口| |--------------------------------| |List queryProducts() | |________________________________| | | ________________________________ | |HotSellingProductService |实现类| | |--------------------------------| |__|List queryProducts() { | | | 查询热销商品 | | |} | \ | |________________________________| 根据配置 | 通过反射___ | ________________________________ 将类实例 | | |TopRatedProductService |实现类| 化为对象 | | |--------------------------------| / | |__|List queryProducts() { | | | 查询好评商品 | 控|依 |} | 制|赖 |________________________________| 反|注 ^ Service层 转|入 ------------------|---------------------------- | ___________________________________ 控制层 | |ProductServlet | | |-----------------------------------| | |ProductService productService; <----------------- | | \ |List products = | 面向接口 | productService.queryProducts();| 解除耦合 |___________________________________| / ^ ------------------|---------------------------- __________ 视图层 | | | 商品列表 | |__________| Servlet不再依赖于具体的Service实现类,降低了控制层对Service层的耦合度。 在配置文件中指定将哪个Service实现类的对象交给Servlet使用,后者完全面向接口编程。 在Service实现类中需要调用Dao接口中的方法,也可以通过类似的机制降低耦合度。 Spring框架提供了面向接口编程的机制。