开放封闭原则 Open Closed Principle
定义
一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。 Software entities like classes, modules and functions should be open for extension but closed for modifications.
-
单一职责原则告诉我们实现类要职责单一
-
里氏替换原则告诉我们不要破坏继承体系
-
依赖倒置原则告诉我们要面向接口编程
-
接口隔离原则告诉我们要在设计接口时要精简单一
-
最少知识原则告诉我们要降低耦合
而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
当我们有新的需求和功能时,我们可以很方便的新增类,完成相应功能,这就需要我们代码遵循依赖倒置原则,我们需要面向接口编程,以接口为代码框架的脉络,继承出多种功能的实现类。另外也要遵循接口隔离原则,只有我们接口功能足够精简,我们新增的类,才可以继承接口就完成单一的功能,否则这个接口如果有多个功能,继承这个接口,要实现多个功能。我的拓展类就会多出需要不必要的朋友关系。也不符合最少知识原则。
这里就不另外举例了。使用依赖倒置原则中的符合例子,单一的注册接口,可以方便的拓展出,网页注册,苹果手机注册,安卓手机注册功能。
对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对其他类做任何修改。
当我们需要修改某个类时,应该尽量少的影响其他类,类的职责要足够单一,类要少和其他类有过多朋友关系,子类尽量不要影响父类。举个例子,之前依赖倒置的时候我们做过一个例子,保存数据的。
public class DBSave {
//这里有人可能会说不符合单一职责,但是对于数据库来说,保存插入一条新数据,
// 里面包含多个字段其实是可以用一句jobc解决的,视为一个单一功能
public void saveMsgFromWeb(String Name, String Pwd)
{
Log.e("ldy","用户名:"+Name+";密码"+Pwd+";注册类型:网页,"+"保存成功,不符合DIP");
}
public void saveMsgFromPhone(String name, String pwd) {
Log.e("ldy","用户名:"+name+";密码"+pwd+";注册类型:手机,"+"保存成功,不符合DIP");
}
}
我们现在修改需求,需要新增需求,注册新增账户属性需要保存,如下
public class DBSave {
//这里有人可能会说不符合单一职责,但是对于数据库来说,保存插入一条新数据,
// 里面包含多个字段其实是可以用一句jobc解决的,视为一个单一功能
public void saveMsgFromWeb(String Name, String Pwd,String account)
{
Log.e("ldy","用户名:"+Name+";密码"+Pwd+";注册类型:网页,"+";账号"+acount+"保存成功,不符合DIP");
}
public void saveMsgFromPhone(String name, String pwd,String account) {
Log.e("ldy","用户名:"+name+";密码"+pwd+";注册类型:手机,"+";账号"+account+"保存成功,不符合DIP");
}
}
这个我们需要修改所有调用DBSave 类的相关类。因此我们应该让DBSave职责更加单一,朋友关系更加的少。如下
public class Save {
public void saveMsg(User user)
{
Log.e("ldy","用户名:"+user.getName()+";密码"+user.getPwd()+";账号"+user.getAccount()+";注册类型:网页,"+"保存成功,不符合DIP");
}
}
public class User {
private String name;
private String pwd;
private String account;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getAccount() {
return account;
}
}
// 测试代码
Save save=new Save();
User user=new User();
user.setName("王五");
user.setPwd("321654");
user.setAccount("7373473");
save.saveMsg(user);
这样修改User类,并不会影响调用Save类的其他类。并且可以在User类对新增修改需求进行初始化。实现了对修改的封闭。