作业一
问:请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
答:依赖倒置原则它描述了以下三件事:
高层模块不应该依赖低层模块,两者都应该依赖抽象类;
抽象也不应该依赖细节,细节应该依赖抽象;
依赖倒置原则的中心思想是面向接口编程,实现方法是策略模式。
所谓的好莱坞原则就是:Don't call me,I'll call you,核心也是高层不需要依赖低层设计,对于好莱坞来说,它需要的是一个符合条件的演员,至于演员具体是谁,开机的时候才知道。
作业二
问:请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
@RestController
@RequestMapping(value = "/order")
public class OrderController{
@Resource
private OrderService orderService;
@PostMapping(value = "/")
public ServerResonse<String> createOrder(@RequestBody OrderReq orderReq){
return orderService.create(orderReq);
}
}
复制代码
public interface OrderService{
ServerResponse<String> create(OrderReq orderReq);
}
复制代码
@Service
public class OrderServerImpl implements OrderService{
@Resource
private OrderMapper orderMapper;
@Override
public ServerResponse<String> create(OrderReq orderReq){
orderMapper.insert(orderReq);
ServerResponse.createSuccessMessage(orderReq.getOrderId);
}
复制代码
public interface OrderMapper{
void insert(OrderReq orderReq);
}
复制代码
@Repostiory(value = "mybatisOrderMapper")
public class MybatisOrderMapper implements OrderMapper{
@Resource
private SqlSession SqlSession;
@Override
public void insert(OrderReq orderReq){
sqlSession.insert(orderReq);
}
}
复制代码
以上就是我们使用 Spring 框架来处理一个业务的步骤,从 Controller->Service->Mapper(Dao),其中使用了两个接口来使得高层模块与低层模块解耦,也就是说 OrderController 和 OrderServiceImol 都依赖于各自的抽象,这样使得我们的代码符合了依赖倒置原则,至少满足了面向接口编程。
那 Spring 是如何来满足我们这样的设计的呢?我们通过给我们的实现类标记 @Controller、@Service、@Repostiory 这三类注解,Spring 会将其初始化并配置到 BeanFactory 中——其实就是一个 HashMap 对象中,key 是 Bean 的名称,value 是对象的实例。再通过 @Resource 注解标记到依赖的接口上,Spring 就通过 byType or byName 的方式,获取到这个接口的具体实现。
假如说,我们现在想用 Hibernate 来做持久化工作,在当前的代码设计下,我们只需要另写一个 OrderMapper 的实现类,上层的代码基本不需要改变。
@Repostiory(value = "hibenateOrderMapper")
public class HibenateOrderMapper implements OrderMapper{
@Resource
private HibenateSqlSession hibenateSqlSession;
@Override
public void insert(OrderReq orderReq){
hibenateSqlSession.insert(orderReq);
}
}
复制代码
@Service
public class OrderServerImpl implements OrderService{
@Resource(name = "hibenateOrderMapper")
private OrderMapper orderMapper;
@Override
public ServerResponse<String> create(OrderReq orderReq){
orderMapper.insert(orderReq);
ServerResponse.createSuccessMessage(orderReq.getOrderId);
}
复制代码
作业三
问:请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
评论