写点什么

第二周作业

用户头像
安阳
关注
发布于: 2020 年 06 月 17 日

作业一:请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

依赖倒置原则:

  • 高层模块不依赖低层模块。高层模块和低层模块应该通过抽象互相依赖。

  • 抽象不要依赖具体实现,而是实现依赖抽象

好莱坞原则“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);

}

}


实现类图


用户头像

安阳

关注

还未添加个人签名 2020.01.04 加入

还未添加个人简介

评论

发布
暂无评论
第二周作业