2.3.6、开放封闭原则

开放封闭原则 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类对新增修改需求进行初始化。实现了对修改的封闭。

发布了39 篇原创文章 · 获赞 2 · 访问量 5003

猜你喜欢

转载自blog.csdn.net/u013636987/article/details/104173870