java里氏代换原则和依赖倒转原则举例
时间: 2024-11-05 09:29:44 浏览: 23
里氏代换原则原文
在Java中,设计模式里的两个重要的原则是“里氏替换原则”(Liskov Substitution Principle, LSP) 和 “依赖倒置原则”(Dependency Inversion Principle, DIP)。
**里氏替换原则(Liskov Substitution Principle)**:
这个原则强调的是子类必须能够替换其基类并仍然保持程序的正确性。例如,假设有一个Animal接口和两个实现了它的子类Dog和Cat。如果代码期望接收任何Animal类型的实例并调用某种通用的行为(如`eat()`),那么使用Dog或Cat替换Animal是不会出现问题的。这是因为Dog和Cat都实现了eat方法并且符合动物的行为预期。
```java
interface Animal {
void eat();
}
class Dog implements Animal {
@Override
public void eat() {
System.out.println("Dog is eating");
}
}
class Cat implements Animal {
@Override
public void eat() {
System.out.println("Cat is eating");
}
}
```
在这个例子中,你可以将Animal类型的数组放入Dog或Cat的对象,因为它们都是Animal的实例,不会违反LSP。
**依赖倒置原则(Dependency Inversion Principle)**:
它建议我们高层模块不应该依赖于低层模块,而是两者都应该依赖于抽象。例如,如果你有一个游戏类Game依赖于具体的图形库Graphics,这违反了DIP。正确的做法是让Game依赖于图形接口IGraphics,然后由框架或配置负责实际选择哪种图形实现。
```java
interface IGraphics {
void draw();
}
class GraphicsImpl implements IGraphics {
@Override
public void draw() {
// 具体图形处理逻辑
}
}
class Game {
private IGraphics graphics;
public Game(IGraphics graphics) {
this.graphics = graphics;
}
public void play() {
graphics.draw();
}
}
```
在这里,Game类只关心如何画图(通过依赖接口IGraphics),而不关心具体是如何实现的。
阅读全文