没有合适的资源?快使用搜索试试~ 我知道了~
读书笔记----设计模式
资源推荐
资源详情
资源评论
单一职责原则:就一个类而言,应该仅有一个引起他变化的原因。
遵循单一职责原的优点有:
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
提高类的可读性,提高系统的可维护性;
变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,
可以显著降低对其他功能的影响。
需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序
设计,都适用单一职责原则。
里氏替换原则:不要重写父类方法
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
它包含以下 4 层含义:
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入
参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严
格。
在实际编程中,我们常常会通过重写父类的方法来完成新的功能,这样写起来虽然简单,
但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的几
率非常大。如果非要重写父类的方法,比较通用的做法是:原来的父类和子类都继承一个
更通俗的基类,原有的继承关系去掉,采用依赖、聚合,组合等关系代替。
依赖倒置原则:抽象不应该依赖细节,细节应该依赖于抽象,解释一下,就是要针对
接口编程,不要对实现编程(策略模式,工厂模式)(简单说,将类抽象出来继承他,由
高层业务实现细节)
问题由来:类 A 直接依赖类 B,假如要将类 A 改为依赖类 C,则必须通过修改类 A 的代码
来达成。这种场景下,类 A 一般是高层模块,负责复杂的业务逻辑;类 B 和类 C 是低层模块,
负责基本的原子操作;假如修改类 A,会给程序带来不必要的风险。
解决方案:将类 A 修改为依赖接口 I,类 B 和类 C 各自实现接口 I,类 A 通过接口 I 间接与
类 B 或者类 C 发生联系,则会大大降低修改类 A 的几率。
依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象
为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。
class Newspaper implements IReader {
public String getContent(){
return "林书豪 17+9 助尼克斯击败老鹰……";
}
}
class Book implements IReader{
public String getContent(){
return "很久很久以前有一个阿拉伯的故事……";
}
}
class Mother{
public void narrate(IReader reader){
System.out.println("妈妈开始讲故事");
System.out.println(reader.getContent());
}
}
public class Client{
public static void main(String[] args){
Mother mother = new Mother();
mother.narrate(new Book());
mother.narrate(new Newspaper());
}
}
接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接
口上。
问题由来:类 A 通过接口 I 依赖类 B,类 C 通过接口 I 依赖类 D,如果接口 I 对于类 A 和类
B 来说不是最小接口,则类 B 和类 D 必须去实现他们不需要的方法。
解决方案:将臃肿的接口 I 拆分为独立的几个接口,类 A 和类 C 分别与他们需要的接口建
立依赖关系。也就是采用接口隔离原则。
举例来说明接口隔离原则:
(图 1 未遵循接口隔离原则的设计)
这个图的意思是:类 A 依赖接口 I 中的方法 1、方法 2、方法 3,类 B 是对类 A 依赖的实现。
类 C 依赖接口 I 中的方法 1、方法 4、方法 5,类 D 是对类 C 依赖的实现。对于类 B 和类 D 来
说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口
I,所以也必须要实现这些用不到的方法。对类图不熟悉的可以参照程序代码来理解,代码如下:
interface I {
public void method1();
public void method2();
public void method3();
public void method4();
public void method5();
}
class A{
public void depend1(I i){
i.method1();
}
public void depend2(I i){
i.method2();
}
public void depend3(I i){
i.method3();
}
}
class B implements I{
public void method1() {
System.out.println("类 B 实现接口 I 的方法 1");
}
public void method2() {
System.out.println("类 B 实现接口 I 的方法 2");
}
public void method3() {
System.out.println("类 B 实现接口 I 的方法 3");
}
//对于类 B 来说,method4 和 method5 不是必需的,但是由于接口
A 中有这两个方法,
剩余17页未读,继续阅读
资源评论
TTdreamloong
- 粉丝: 90
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- tensorflow-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp39-cp39-manylinux2010-x86-64.whl
- Python版本快速排序源代码
- Python 语言版的快速排序算法实现
- 450815388207377安卓_base.apk
- 超微主板 X9DRE-TF+ bios 支持 nvme启动
- 基于Python通过下载气象数据和插值拟合离散数据曲线实现对寒潮过程的能量分析
- 健身房系统的设计与实现论文Java项目
- 使用TCP实现的搜索可用服务器
- 使用贪心算法解决会议时间安排问题的 Java 示例代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功