第二周作业

用户头像
安阳
关注
发布于: 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 加入

还未添加个人简介

评论

发布
暂无评论
第二周作业