1.开闭原则(OCP)-依赖倒置原则(DIP)-里氏代换原则(LSP) (1)指出按照如下类图设计将会引出的问题
时间: 2024-12-08 16:18:13 浏览: 33
开闭原则(Open-Closed Principle, OCP)、依赖倒置原则(Dependency Inversion Principle, DIP)和里氏替换原则(Liskov Substitution Principle, LSP)都是面向对象设计的核心原则:
1. **开闭原则**:软件实体应该是"开放"的,即对扩展开放,对修改封闭。如果需要添加新的功能,应该通过扩展现有的模块而不是修改它们。如果按照这个原则设计,比如在类图中直接修改原有的接口或类的行为,可能导致其他依赖该类的代码也需要修改,违反了“封闭”的要求。
2. **依赖倒置原则**:高层模块不应该依赖于低层模块,两者都应该依赖于抽象。如果类图中的依赖关系不符合这个原则,例如,底层模块直接依赖于具体的业务逻辑,当底层发生改变时,高层可能会受到影响,因为依赖关系并没有反转。
3. **里氏替换原则**:子类型必须能够替换掉它们的基类型,而不影响程序的预期行为。若在类图中,某个子类不能替换其父类的对象并按预期工作,那么违背了LSP,如父类引用指向子类实例,而子类的一些行为不是父类所期望的。
假设我们有这样一个类图:
```
+-------------------+
| ComponentA |
+-------------------+
| - service: ServiceB|
+-------------------+
| void operate() |
+-------------------+
+--------------------+
| ServiceB |
+--------------------+
| + doSomething() |
+--------------------+
```
如果将`ServiceB`替换为它的子类`ServiceC`,而`ComponentA`没有使用`ServiceB`的抽象类型,而是直接依赖于`ServiceB`,那么当`ServiceC`改变了行为(如增加新方法或修改现有方法),`ComponentA`的操作可能会出错,因为它依赖的具体实现变了。这就是违反了这三个原则的情况。正确的做法应该是让`ComponentA`依赖于`IService`这样的抽象接口,而不是具体的服务实现。
阅读全文