J03.5 质量 qualité
J03.5 质量 qualité
SOLID
- 单一职责原则(SRP: Single Responsibility Principle)
- 开闭原则(OCP: Open/Closed Principle)
- 里氏替换原则(LSP: Liskov Substitution Principle)
- 接口隔离原则(ISP: Interface Segregation Principle)
- 依赖反转原则(DIP: Dependency Inversion Principle)
SRP:单一职责原则
- 一个类(一个函数、一个方法)应该只承担一个职责。
- 每个职责的变更会引发类的修改(规范的变动)。
- 一个承担多重职责的类会导致职责之间的耦合。
OCP:开闭原则(Open/Closed Principle)
- 一个模块(类、包)应对扩展开放,对修改关闭:
- 对扩展开放:模块可以通过新行为扩展。
- 对修改关闭:这些扩展不需要修改已有代码。
- 使用面向对象机制:组合、继承、抽象类、接口等。
- 根据以下需求识别开闭点:
- 客户的可扩展性需求。
- 开发者的灵活性需求。
LSP:里氏替换原则(Liskov Substitution Principle)
- 如果 S 是 T 的子类型,则 T 类型的对象可以被 S 类型的对象替换,而不会破坏程序的正确性。
- 该原则可能与继承作为代码复用的使用方式相冲突:子类必须保持可替换性。
- 按契约设计:在子类中重新定义方法时,可以弱化前置条件,但必须保留或增强后置条件。
ISP:接口隔离原则(Interface Segregation Principle)
- 客户端不应被迫依赖它不使用的接口。
- 每个客户端只应“看到”它实际使用的服务。
- 避免的常见错误:将一组服务积累到一个类中,导致不必要的依赖。
- 解决方案:为不同类型的客户端设计独立的接口
DIP:依赖反转原则(Dependency Inversion Principle)
- 高层模块(业务逻辑)不应依赖于低层模块(细节),两者都应依赖于抽象。
- 抽象不应依赖于细节;细节应该依赖于抽象。
- 低层模块更容易因执行环境的变化而修改。
- 高层模块(业务逻辑)应依赖抽象(接口),以建模所需的服务。
STUPID
- Singleton(单例模式的滥用)。
- Tight coupling(强耦合)。
- Untestability(不可测试)。
- Premature optimization(过早优化)。
- Indescriptive naming(缺乏描述性的命名)。
- Duplication(代码重复)。
DRY, KISS, YAGNI
- DRY: Don't Repeat Yourself(不要重复自己)。
- KISS: Keep It Simple Stupid(保持简单,傻瓜化)。
- YAGNI: You Aren’t Gonna Need It(你不会需要它)。
LoD:迪米特法则(Law of Demeter)
- 原则:只与直接的邻居通信。
- 允许发送消息给:
- 自身(
this
)。 - 被存储为属性的对象。
- 方法的参数对象。
- 方法创建的对象。
- 全局对象(如单例)。
- 自身(
模型-视图-控制器 (MVC)
- 模型 (Model):负责数据的管理和更新。
- 视图 (View):负责数据的展示。
- 控制器 (Controller):负责用户交互和业务逻辑。
- 关系图:
- 用户的操作通过控制器影响数据的更新,同时通知视图进行刷新。
设计模式
- 定义:
- 设计模式是通用问题的通用解决方案。
- 提供了灵活和可重用的设计。
- 分类:
- 创建型模式:工厂方法、抽象工厂、建造者、原型、单例。
- 结构型模式:适配器、桥接、组合、装饰器、外观、享元、代理。
- 行为型模式:观察者、迭代器、命令、责任链、状态、策略、模板方法等。
- 重要模式介绍:
- 组合模式:支持对象树结构,允许将对象组视为单个对象。
- 装饰器模式:动态修改对象行为,比继承更灵活。
- 原型模式:通过克隆现有对象创建新对象。
- 单例模式:确保类的唯一实例并提供全局访问点。
创建型模式
创建型模式主要解决对象实例化的灵活性问题,提供创建对象的通用解决方案,确保代码对对象类型的依赖降低,同时提高扩展性。以下是五种常用的创建型模式:
- 工厂方法模式(Factory Method)
定义:定义一个创建对象的接口,但由子类决定实例化哪一个类。
特点:使用工厂方法代替直接实例化,使代码对具体类解耦。
示例:
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// 抽象产品
public interface Product {
void use();
}
// 具体产品
public class ConcreteProductA implements Product {
public void use() { System.out.println("Using Product A"); }
}
public class ConcreteProductB implements Product {
public void use() { System.out.println("Using Product B"); }
}
// 工厂接口
public abstract class Creator {
public abstract Product createProduct();
}
// 具体工厂
public class ConcreteCreatorA extends Creator {
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteCreatorB extends Creator {
public Product createProduct() {
return new ConcreteProductB();
}
}
- 抽象工厂模式(Abstract Factory)
定义:提供一个创建相关对象家族的接口,而无需指定具体类。
特点:解决多个产品之间的一致性问题(同一个工厂创建相关产品)。
示例:
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// 抽象产品
public interface Chair { void sit(); }
public interface Table { void place(); }
// 具体产品
public class VictorianChair implements Chair {
public void sit() { System.out.println("Sitting on a Victorian Chair"); }
}
public class ModernChair implements Chair {
public void sit() { System.out.println("Sitting on a Modern Chair"); }
}
public class VictorianTable implements Table {
public void place() { System.out.println("Placing items on a Victorian Table"); }
}
public class ModernTable implements Table {
public void place() { System.out.println("Placing items on a Modern Table"); }
}
// 抽象工厂
public interface FurnitureFactory {
Chair createChair();
Table createTable();
}
// 具体工厂
public class VictorianFurnitureFactory implements FurnitureFactory {
public Chair createChair() { return new VictorianChair(); }
public Table createTable() { return new VictorianTable(); }
}
public class ModernFurnitureFactory implements FurnitureFactory {
public Chair createChair() { return new ModernChair(); }
public Table createTable() { return new ModernTable(); }
}
- 建造者模式(Builder)
定义:将一个复杂对象的构造与其表示分离,使相同的构建过程可以创建不同的表示。
特点:逐步构建复杂对象,尤其适合对象有多个可选参数时。
示例:
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
28public class Product {
private String partA;
private String partB;
public void setPartA(String partA) { this.partA = partA; }
public void setPartB(String partB) { this.partB = partB; }
public void show() { System.out.println(partA + ", " + partB); }
}
public interface Builder {
void buildPartA();
void buildPartB();
Product getResult();
}
public class ConcreteBuilder implements Builder {
private Product product = new Product();
public void buildPartA() { product.setPartA("PartA"); }
public void buildPartB() { product.setPartB("PartB"); }
public Product getResult() { return product; }
}
public class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
- 原型模式(Prototype)
定义:通过复制现有对象来创建新对象,而不是通过实例化类。
特点:通过克隆方法快速创建对象,适合对象创建开销大的场景。
示例:
1
2
3
4
5
6
7
8
9
10
11
12public abstract class Prototype implements Cloneable {
public Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone();
}
}
public class ConcretePrototype extends Prototype {
private String field;
public void setField(String field) { this.field = field; }
public String getField() { return field; }
}
- 单例模式(Singleton)
定义:确保某个类只有一个实例,并提供全局访问点。
特点:常用于共享资源的访问。
示例:
1
2
3
4
5
6
7
8
9
10
11public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
结构型模式
结构型模式用于描述类和对象的组合方式,确保系统结构更灵活和可扩展。以下是常见的结构型模式:
- 适配器模式(Adapter)
定义:将一个类的接口转换为客户端期望的接口,使原本不兼容的类可以协同工作。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public interface Target {
void request();
}
public class Adaptee {
public void specificRequest() {
System.out.println("Specific Request");
}
}
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
- 组合模式(Composite)
定义:将对象组合成树状结构,客户端可以统一处理单个对象和对象组合。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public abstract class Component {
public abstract void operation();
}
public class Leaf extends Component {
public void operation() { System.out.println("Leaf operation"); }
}
public class Composite extends Component {
private List<Component> children = new ArrayList<>();
public void add(Component component) { children.add(component); }
public void operation() {
for (Component child : children) {
child.operation();
}
}
}
- 装饰器模式(Decorator)
定义:动态地给对象添加职责,而不影响其他对象的功能。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public interface Component {
void operation();
}
public class ConcreteComponent implements Component {
public void operation() { System.out.println("Base Operation"); }
}
public class Decorator implements Component {
protected Component component;
public Decorator(Component component) { this.component = component; }
public void operation() { component.operation(); }
}
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) { super(component); }
public void operation() {
super.operation();
System.out.println("Additional Operation");
}
}
行为型模式
行为型模式注重对象间的职责分配和协作方式。以下是常见的行为型模式:
- 观察者模式(Observer)
定义:定义一对多的依赖关系,当对象状态发生变化时,自动通知依赖的观察者。
示例:
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
30public interface Observer {
void update(String state);
}
public class Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void setState(String state) {
this.state = state;
notifyObservers();
}
private void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
}
public class ConcreteObserver implements Observer {
public void update(String state) {
System.out.println("State changed: " + state);
}
}
- 迭代器模式(Iterator)
定义:提供一种访问容器中元素的方法,而不暴露其内部结构。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public interface Iterator<T> {
boolean hasNext();
T next();
}
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> list;
private int index = 0;
public ConcreteIterator(List<T> list) {
this.list = list;
}
public boolean hasNext() {
return index < list.size();
}
public T next() {
return list.get(index++);
}
}
- 策略模式(Strategy)
定义:定义一组算法,将每种算法封装到独立的类中,使其可以互换。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14public interface Strategy {
void execute();
}
public class ConcreteStrategyA implements Strategy {
public void execute() { System.out.println("Executing Strategy A"); }
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy) { this.strategy = strategy; }
public void executeStrategy() { strategy.execute(); }
}