读书笔记----软件设计原则、设计模式
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology |
| ---- | ---- | ---- | ---- |
| 这个作业要求在哪里| https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology/homework/11833 |
| 这个作业的目标 | <了解软件设计模式及其原则> |
书籍详情
书名 | 主编 | 出版社 | 内容简介 | 书籍来源 |
---|---|---|---|---|
软件设计模式 | 朱洪军 | 人民邮电出版社 | 本书主要内容包括:第一章和第二章是学习基础。第三章为模式概念介绍。第四到六章,针对不同的模式采用:定义,问题分析,解决问题,应用案例的结构进行内容描述。第七章为行业案例,采用Java技术实现设计模式。 | https://www.zhihu.com/pub/reader/119630412 |
设计原则
| 软件的七大原则| 说明 |
| ---- | ---- | ---- | ---- |
| 开-闭原则(Open-Closed Principle, OCP) | 一个软件实体应当对扩展开发,对修改关闭 |
| 里氏代换原则(Liskov Substitution Principle,常缩写为.LSP) | 一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别 |
| 依赖倒置原则(Dependence Inversion Principle) | 要求客户端依赖于抽象耦合 |
| 接口隔离原则(Interface Segregation Principle, ISP) | 一个类对另外一个类的依赖是建立在最小的接口上 |
| 合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP) | 在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过这些向对象的委派达到复用已有功能的目的.这个设计原则有另一个简短的表述:要尽量使用合成/聚合,尽量不要使用继承. |
| 迪米特法则(Law of Demeter LoD)又叫做最少知识原则(Least Knowledge Principle,LKP) | 一个对象应当对其他对象有尽可能少的了了解 |
| 单一职责原则(Simple responsibility pinciple SRP) | 就一个类而言,应该仅有一个引起它变化的原因,如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.应该把多于的指责分离出去,分别再创建一些类来完成每一个职责. |
设计模式
1、创建型模式
| 模式名称 | 模式说明 |
| ---- | ---- | ---- | ---- |
| 简单工厂模式 | 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。 |
| 工厂方法模式 | 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。 |
| 抽象工厂模式 | 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 |
| 建造者模式 | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 |
| 原型模式 | 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 |
| 单例模式 | 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。 |
2、结构型模式
结构型模式涉及到如何组合类和对象以获得更大的结构。结构型模式采用继承机制来组合接口或实现。结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性。通过学习适配器、装饰、桥接、组合、享元、代理和外观这其中模式,让我们了解到要优先使用对象组合,而不是类继承的原则在结构型模式中体现的淋漓尽致,这里不优先使用类继承主要是因为,随着类继承层次的赠多,类于类之间的耦合度也会急剧增加,这样在修改或维护时带来很多的麻烦。组合/聚合模式很好的解决了这个问题。
3、行为型模式
行为型模式是 GoF 设计模式中最为庞大的一类,它包含以下 11 种模式。
模式名称 | 模式说明 |
---|---|
模板方法(Template Method)模式 | 定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 |
策略(Strategy)模式 | 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 |
命令(Command)模式 | 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 |
职责链(Chain of Responsibility)模式 | 把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。 |
状态(State)模式 | 允许一个对象在其内部状态发生改变时改变其行为能力。 |
观察者(Observer)模式 | 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。 |
中介者(Mediator)模式 | 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。 |
迭代器(Iterator)模式 | 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 |
访问者(Visitor)模式 | 在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。 |
备忘录(Memento)模式 | 在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。 |
解释器(Interpreter)模式 | 提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。 |
心得体会
单一职责原则例子
这里的类都仅有一个引起它变化的原因,严格遵守单一职责原则
统计文件的字符数
//统计文件的字符数
private static int zifu(String filename) {
File file=new File(filename);
BufferedReader reader=null;
int character=0;
try{
reader = new BufferedReader(new FileReader(file));
String tempchar;
while ((tempchar=reader.readLine()) != null) {
character += tempchar.length();
}
reader.close();
}
catch(Exception e){
JOptionPane.showMessageDialog(null, "不存在该文件");
}
return character;
统计文件的行数
//统计file文档的行数
public static int line(String fileName) {
File file = new File(fileName);
int line = 0;
BufferedReader reader = null;
String tempString = null;
try {
reader = new BufferedReader(new FileReader(file));
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
line++;
}
reader.close();
} catch (IOException l) {
l.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
// 返回行数
return line;
}
统计文件的单词数
//统计文件的单词数
public static int word(String fileName) {
File file = new File(fileName);
int word = 0;
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
Pattern Pa =Pattern.compile("[a-zA-Z]+\\b");//判定为单词的正则表达式条件
String w=null;
while ((w = reader.readLine()) != null) {
Matcher Ma =Pa.matcher(w);
while(Ma.find()) //当找到单词时,单词数+1
word++;
}
reader.close();
} catch (IOException k) {
k.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
// 返回单词数
return word;
}