设计模式七大设计原则之开闭原则(Open Close Principle)
1.开闭原则介绍
- 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭,用抽象构建框架,用实现扩展细节。
- 当软件实体需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
2.案例分析
场景: 人吃鱼和蔬菜
传统解决方法:
类图
代码实现:
package com.ldx.ocp;
public class OpenClose {
public static void main(String[] args) {
Person p = new Person();
Fish f = new Fish();
Vegetable vegetable=new Vegetable();
p.eatFish(f);
p.eatVegetable(vegetable);
}
}
class Fish {
public String eated() {
return "鱼被吃了";
}
}
class Vegetable{
public String eated(){
return "蔬菜被吃了";
}
}
class Person {
public void eatFish(Fish fish) {
System.out.println("人在吃鱼," + fish.eated());
}
public void eatVegetable(Vegetable vegetable){
System.out.println("人在吃蔬菜,"+vegetable.eated());
}
}
运行结果:
当需要吃其他食物如水果时,这个程序就要修改很多地方,不仅要新建一个其他食物的类,Person这个类也要做修改,不满足开闭原则。
改进方案:用抽象构建框架,将食物抽象成一个接口,有个方法eated(),各种食物都实现这个接口即可
类图:
代码:
package com.ldx.ocp.improve;
public class OpenClose {
public static void main(String[] args) {
Person p = new Person();
Fish f = new Fish();
Vegetable vegetable = new Vegetable();
OtherFood other = new OtherFood();
p.eat(f);
p.eat(vegetable);
p.eat(other);
}
}
interface Food {
String eated();
}
class Fish implements Food {
public String eated() {
return "鱼被吃了";
}
}
class Vegetable implements Food {
public String eated() {
return "蔬菜被吃了";
}
}
class OtherFood implements Food {
public String eated() {
return "其他食物被吃了";
}
}
class Person {
public void eat(Food food) {
System.out.println("人在吃食物," + food.eated());
}
}
运行结果
小结:
开闭原则是程序设计的关键所在,要用抽象去构建框架,尽量通过扩展去解决程序需求变更问题,而不是通过修改原来的代码。
七大设计原则汇总:七大设计原则汇总