第二周作业
作业一:请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则:
高层模块不依赖低层模块。高层模块和低层模块应该通过抽象互相依赖。
抽象不要依赖具体实现,而是实现依赖抽象
好莱坞原则“Don't call me, I'll call you”。依赖倒置原则指不是应用调用框架,而是框架调用应用。框架通过抽象调用应用,应用实现抽象被框架调用。好比框架就是 me,应用就是 you.
作业二:请描述一个你熟悉的框架,是如何实现依赖倒置原则的
logback 日志框架的配置文件 xml 中,有 encoder 标签,只要实现 Encoder<E>接口,提供 headerBytes():byte[]、encode(E event):byte[]、footerBytes():byte[]三个方法,在配置 encode 标签时,指定 className 为你的实现类,encoder 实例在日志框架初始化时,由日志框架创建 coder 并注入给 appender 用于实现将日志事件 IEvent 输出到具体的 appender。简单来说就是,使用 xml 配置描述类层级关系中实现接口的实现类,在日志框架初始化时,会根据标签的解析创建对象和初始化对象。
作业三:请用接口隔离原则优化 Cache 类的设计,画出优化后的类图
提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行过程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。
// 应用访问接口
public interface BufferCache {
/**
* 从缓存中获取指定{@code key}对应的值
* @param key
* @return {@code key}对应的值
*/
Object get(Object key);
/**
* 将{@code value}放入缓存中,并指定关联的{@code key}
* @param key
* @param value
*/
void put(Object key, Object value);
/**
* 将指定{@code key}关联的值从缓存中删除
* @param key
*/
void delete(Object key);
}
// 远程配置访问接口
public interface LoadingCache {
/**
* 重新加载 Cache 配置
*/
void reBuild(Config conf);
}
// 配置接口
public interface Config {
/**
* 创建新的 BufferCache
*/
BufferCache newBufferCacheInitBy(@Nullable BufferCache cache);
}
// Cache 实现类
public class Cache implements BufferCache, LoadingCache {
private BufferCache cache = null;
@Override
public Object get(Object key) {
cache.get(key);
}
@Override
public void put(Object key, Object value) {
cache.put(key,value);
}
@Override
public void delete(Object key) {
cache.delete(key);
}
@Override
public void reBuild(Config config) {
cache = config.doConfig(this);
}
}
实现类图
评论