概念:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。不修改源码,通过新增类扩展功能。
例子: 描述车的属性,颜色,轮胎个数,现在加装一个导航仪(需要改动的地方)
interface ICar {
String getColor();
int getWheels();
}
interface INewCar extends ICar {
String getNavigation();
}
class Car implements ICar {
private String color;
private int wheels;
@Override
public String getColor() {
// TODO Auto-generated method stub
return color;
}
@Override
public int getWheels() {
// TODO Auto-generated method stub
return wheels;
}
public Car(String color, int wheels) {
this.color = color;
this.wheels = wheels;
}
@Override
public String toString() {
return "Car [color=" + color + ", wheels=" + wheels + "]";
}
}
class NewCar implements INewCar {
private String color;
private int wheels;
private String navigation;
public NewCar(String color, int wheels, String navigation) {
this.color = color;
this.wheels = wheels;
this.navigation = navigation;
}
@Override
public String getColor() {
// TODO Auto-generated method stub
return color;
}
@Override
public int getWheels() {
// TODO Auto-generated method stub
return wheels;
}
@Override
public String getNavigation() {
// TODO Auto-generated method stub
return navigation;
}
@Override
public String toString() {
return "NewCar [color=" + color + ", wheels=" + wheels + ", navigation=" + navigation + "]";
}
}
测试
import java.util.ArrayList;
public class Test {
private final static ArrayList<ICar> carList = new ArrayList<ICar>();
static {
carList.add(new Car("red", 4));
carList.add(new Car("white", 2));
carList.add(new NewCar("black", 4, "谷歌导航"));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for (ICar car : carList) {
// car.toString();
System.out.println(car.toString());
}
}
}
打印结果
Car [color=red, wheels=4]
Car [color=white, wheels=2]
NewCar [color=black, wheels=4, navigation=谷歌导航]
总结:开闭原则用扩展接口去实现,不改变源码,例子中直观的感受就是增加了新接口INewCar
和新实现类NewCar
.
网友评论