Week 02- 作业:设计原则
作业一:依赖倒置
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则Dependency Inversion Principle,缩写为 DIP。有时候也称依赖反转原则。
High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.
高层模块(high-level modules)不要依赖低层模块(low-level),应该通过抽象(abstractions)来相互依赖。
抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。
从定义上来看,包含三个元素,高层模块、低层模块、抽象。元素之间的关系应该如下:
以抽象(抽象类/接口)定义行为,低层模块继承/实现抽象(包含具体细节),高层模块依赖抽象(组合/聚合)。
以下图来说,在不使用DIP原则时,【用户】直接依赖【APP订餐】,也可以实现功能,但同时存在PC网络订餐的需求,直接依赖会导致业务耦合过重。使用DIP原则+策略模式,就可以初步进行业务的隔离(包括代码的隔离)。
至此,再回到概念本身【依赖倒置】,这个倒置要怎么理解?我只是在高层模块和底层模块中间引入了抽象,高层还是高层,低层还是低层?个人理解如下:
引入抽象之前,从某种程度上来说,高层要依赖低层提供的方法才能够完成具体的业务;
引入抽象之后,高层摆脱了对低层的依赖,需要什么自己来调用,不关心低层的细节;
二者的关系有了一个倒置/反转,籍于此种理解,个人更喜欢【依赖反转】这个叫法。
从以上描述中不难看出,高层模块想使用哪个功能(低层模块中的具体细节),由其自己决定,低层模块只负责实现细节--->这正是好莱坞原则(Hollywood Principle):don't call me ,i'll call you 的核心思想,因此有时候依赖反转原则又被称为好莱坞原则。
作业二:框架描述
请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
以在IIS(Internet Information Services)下部署.net frameworks Web应用为例:
IIS是部署 Web 应用程序的容器。 Web 应用程序只需要部署在 IIS下,便可以被 IIS容器调用执行。以DIP原则划分,IIS就是高层模块, Web 应用程序代码就是低层模块。IIS和应用程序代码之间并没有直接的依赖关系,两者都依赖同一个“抽象”,也就是 Httpcontext(有点不太确定)。Httpcontext规范不依赖具体的 IIS容器和应用程序的实现细节,而 IIS容器和应用程序依赖 Httpcontext规范。
作业三:Cache类图
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图
版权声明: 本文为 InfoQ 作者【dean】的原创文章。
原文链接:【http://xie.infoq.cn/article/343e0af5b643566e6c01763be】。文章转载请联系作者。
评论