0%

设计模式

期末复习

理论

  • 模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案
  • 设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,描述了对象和类之间的相互作用。
  • 设计模式的优点:融合了专家的经验,方便人们使用,设计更加灵活,提高软件质量,有助于理解面向对象思想。

七个常用的面向对象的设计原则:

  1. 单一职责原则(SRP):一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中
  2. 开闭原则(OCP):软件应该对修改关闭,对扩展开放
  3. 里氏代换原则(LSP):所有引用基类的地方必须能够透明的使用其子类的对象
  4. 依赖倒转原则(DIP):高层模块应该依赖抽象,细节依赖于抽象
  5. 接口隔离原则(ISP):不依赖不需要的接口
  6. 合成复用原则(CRP):优先使用对象组合而不是继承
  7. 迪米特法则(LoD):每个软件单位对其他的单位都只有最少的知识,且局限于密切相关的软件单位

设计模式优缺点:

模式 优点 缺点
简单工厂 创建使用相分离;无需知道类名;用配置文件 灵活 工厂类职责过重;工厂类个数多,复杂 难以理解;系统扩展困难
工厂方法 完全符合开闭原则;不用关心创建细节;多态性设计 添加新产品需要成对增加;复杂,难以理解
建造者 创建过程解耦;建造者相对独立;精细控制创建过程 产品差异大不适合使用;复杂 难以理解
原型 提高创建效率;扩展性好;可以保存对象状态 对类改造时违反开闭原则;深克隆较为复杂
单例 严格控制访问;提高性能 扩展难;职责过重;长时间不使用会被回收
适配器 解耦;增加复用;灵活可扩展 适配者不能为终类;只能继承一个类
桥接 解耦;减少子类个数;符合开闭 可扩展 复杂 难以理解;需要正确识别两个维度
组合 灵活;简化客户端代码;清楚分层次 增加新构件难;复杂 难以理解
外观 简化客户端代码;松耦合;修改对子系统没影响 不灵活;设计不当违背开闭
代理 解耦合;灵活可扩展;提高效率 处理速度变慢;复杂
职责链 解耦合;简化连接;动态管理;符合开闭 配置不好不会处理;调试不便;死循环
命令 解耦合;满足开闭 复杂 难以理解
中介者 简化对象交互;解耦 复杂 难以理解 难以维护
备忘录 实现信息封装;提供实现机制 资源消耗过大
观察者 表示与逻辑分离;解耦合;简化设计;符合开闭 通知耗时;死循环;不知道变化的细节
模板方法 符合单一职责和开闭原则 可变的基本方法太多会导致类个数增加

猫鼠

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public abstract class Subject {

protected List<Observer> observers = new ArrayList<>();

public void add(Observer observer){
observers.add(observer);
}

public void remove(Observer observer){
observers.remove(observer);
}

public abstract void notifyall();
}

public class Cat extends Subject {
@Override
public void notifyall() {
observers.forEach(Observer::response);
}
}

public interface Observer {
void response();
}

public class Mouse implements Observer {

private final String name;

public Mouse(String name) {
this.name = name;
}

@Override
public void response() {
System.out.println(this.name + "开始逃跑");
}
}

public class Master implements Observer {
@Override
public void response() {
System.out.println("主人醒了");
}
}

public class Client {
public static void main(String[] args) {
Cat cat = new Cat();
Mouse mouse1 = new Mouse("老鼠1");
Mouse mouse2 = new Mouse("老鼠2");
Mouse mouse3 = new Mouse("老鼠3");
Master master = new Master();
cat.add(mouse1);
cat.add(mouse2);
cat.add(mouse3);
cat.add(master);
cat.notifyall();
}
}

本文标题:设计模式

文章作者:fanchen

发布时间:2021年12月28日 - 15:19:39

最后更新:2021年12月28日 - 17:08:17

原始链接:http://88fanchen.github.io/posts/364ea8cc/

许可协议:署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。