开闭原则、里氏更换与单一职责:软件计划的核心原则

[复制链接]
发表于 2026-1-14 06:55:47 | 显示全部楼层 |阅读模式
 接待来到我的主页:【一只认真写代码的步伐猿
假如这篇文章对你有资助,渴望点赞收藏加关注啦~

目次

1 开闭原则内容引出
1.1 开闭原则
1.2 开闭原则示例
2 里氏更换原则
3 单一职责内容引出
​编辑3.1 单一职责
3.2 类的单一
3.3 方法单一
3.4 接口单一


1 开闭原则内容引出


 


1.1 开闭原则

界说:一个软件实体,类,函数,模块;对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。可以进步软件的可复用性和可维护性。
开发新功能时,只管不修改原有代码,只管使用扩展来增长新功能
实现开闭原则的焦颔首脑是:面向抽象编程,而不是面向实现编程。
界说的对象范例是:抽象or接口;调用的是抽象类or接口中的方法。抽象是稳固的,让一个类依靠于抽象,实现对修改关闭。再通过面向对象的继续多态,实现对抽象的继续,通过重写方法or实现新的扩展方法。
1.2 开闭原则示例

  1. /**
  2. * 商品接口
  3. */
  4. public interface IGood {
  5.     Integer getId();
  6.     String getName();
  7.     Double getPrice();
  8. }
复制代码
  1. /**
  2. * 普通商品
  3. */
  4. public class NormalGood implements IGood {
  5.     private Integer id;
  6.     private String name;
  7.     private Double price;
  8.     public NormalGood(Integer id, String name, Double price) {
  9.         this.id = id;
  10.         this.name = name;
  11.         this.price = price;
  12.     }
  13.     @Override
  14.     public Integer getId() {
  15.         return this.id;
  16.     }
  17.     @Override
  18.     public String getName() {
  19.         return this.name;
  20.     }
  21.     @Override
  22.     public Double getPrice() {
  23.         return this.price;
  24.     }
  25.     @Override
  26.     public String toString() {
  27.         return "...普通商品信息"
  28.     }
  29. }
复制代码
  1. /**
  2. 添加打折功能
  3. 根据开闭原则 , 对修改关闭 , 对扩展开放;
  4. 定义子类,在继承普通商品的基础上,扩展的新功能;
  5. 不用实现接口,而是继承普通类。
  6. 站在会员卡角度如下:
  7. card接口;普通用户类;银卡继承普通用户;金卡继承银卡
  8. */
  9. public class DiscountGood extends NormalGood {
  10.     public DiscountGood(Integer id, String name, Double price) {
  11.         super(id, name, price);
  12.     }
  13.     @Override
  14.     public Double getPrice() {
  15.         return super.getPrice() * 0.8;//折扣位置
  16.     }
  17. }
复制代码

2 里氏更换原则

子类可以扩展父类的功能,但不能改变父类原有的功能。
是开闭原则的告急方式之一,由于使用父类对象的地方都可以使用子类对象,因此在步伐中只管使用父类范例来对对象举行界说,而在运行时再确定其子类范例,用子类对象来更换父类对象。
  1. public class FatherClass {
  2.     public void method(HashMap map) {
  3.         System.out.println("执行父类 void method(HashMap map) 方法");
  4.     }
  5. }
  6. public class ChildClass extends FatherClass {
  7.     /**
  8.      * 重写
  9.      * 重写 ( 返回值 严格 ) : 当 子类的方法 重写 / 重载 / 实现 父类的方法时
  10.      *      方法的 后置条件 ( 返回值 ) 要 比父类更严格或相等;
  11.      */
  12.     @Override
  13.     public void method(HashMap map) {
  14.         System.out.println("执行子类重写的 void method(HashMap map) 方法");
  15.     }
  16.     /**
  17.      * 重载
  18.      * 重载 ( 输入参数 宽松 ) : 子类的方法 重载 父类的方法 时
  19.      *      方法的前置条件 ( 输入参数 ) , 要比 父类方法的输入参数更宽松 ;
  20.      *
  21.      * 如果在父类中参数类型是 Map
  22.      *      在子类中重载参数类型是 HashMap
  23.      *      这样就会出现混乱的问题
  24.      * 客户端调用时 , 可能不清楚情况 , 加入传入了 HashMap 参数
  25.      *      此时就有可能出现混乱 , 无法调用到 父类/子类的 正常重写方法
  26.      *      方法调用被重载方法拦截的情况
  27.      *
  28.      * 如果 重载的方法 的参数 比父类的方法参数更严格
  29.      *      那么这就不是重载方法 , 而是重写方法
  30.      */
  31.     public void method(Map map) {
  32.         System.out.println("执行子类重载的 void method(Map map) 方法");
  33.     }
  34. }
复制代码


3 单一职责内容引出


3.1 单一职责


界说:不要存在多余一个导致类变动的缘故起因。
假设有一个类,负责“A”和“B”;一旦需求变动,如A功能改变,修改该类A功能时,有大概导致B功能发生故障。对于该环境,应该对于AB各自创建独立的类,包管体系的稳固性。
开发方法:一个类只负责一项职责(类、接口、方法)
长处:可读性高、进步体系可维护性、低沉类的复杂度、低沉需求变动导致的风险。
模块化的体系中,都适当使用单一职责。
  1. //以下代码均违反了单一职责原则
  2. public class Dog{
  3.     public void mainDogs(String name) {
  4.         if ("小狗".equals(name)) {
  5.             System.out.println("puppy's name is "+name);
  6.         } else {
  7.             System.out.println("Dog's name is "+name);
  8.         }
  9.     }
  10. }
  11. //-----------------------------------------------------------------
  12. public class Order {
  13.     private String orderId;
  14.     private String userId;
  15.     private String productId;
  16.     private double amount;
  17.     private OrderStatus status;
  18.     public void createOrder(String userId, String productId, double amount) {
  19.         // 创建订单  
  20.     }
  21.     public void payOrder() {
  22.         // 支付订单  
  23.     }
  24.     public void shipOrder() {
  25.         // 发货
  26.     }
  27.     public void completeOrder() {
  28.         // 完成订单
  29.     }
  30. }
复制代码
3.2 类的单一

  1. /**
  2. *本类的职责单一,只负责puppy
  3. */
  4. public class Puppy{
  5.     public void IsPuppy(String name) {
  6.         System.out.println("Puppy's name is "+name);
  7.     }
  8. }
  9. public class Dog{
  10.     public void IsDog(String name) {
  11.         System.out.println("Dogs's name is "+name);
  12.     }
  13. }
  14. //--------------------------------------------------
  15. // 订单接口
  16. public interface Order {
  17.     void create();
  18.     void pay();
  19.     void ship();
  20.     void complete();
  21. }
  22. // 创建类
  23. public class OrderCreator implements Order {
  24.     @Override
  25.     public void create() {
  26.     // 创建订单的业务逻辑
  27.     }
  28. }
  29. ...其他业务类
  30. // 订单完成类
  31. public class OrderCompleter implements Order {
  32.     @Override
  33.     public void complete() {
  34. // 完成订单的逻辑
  35.     }
  36. }
复制代码
3.3 方法单一

假如方法中存在大片的if-else阐明是不完满的代码,而我们在开发中着实应该制止如is-else大概switch等条件语句。
  1. //违反单一原则的代码
  2. //如果只针对价格or名字or描述进行修改,会连带修改另外两个,存在一定风险
  3. public class Good {
  4.     public void updateGoodInfo(String name, double price,String description) {
  5.             //更新商品信息逻辑
  6.     }
  7. }
  8. //修改后:
  9. public class Good{
  10.     public void updateGoodName(String Name){
  11.             //修改名字
  12.     }
  13.     public void updateGoodPrice(String Name){
  14.             //修改价格
  15.     }
  16.     public void updateGoodDescription(String Name){
  17.             //修改商品描述
  18.     }
  19. }
复制代码
3.4 接口单一

  1. public interface IGood {
  2.     //获取名称
  3.     String getName();
  4.     //获取价格
  5.     double getPrice();
  6.     //获取商品描述
  7.     String getDescription();
  8.     //购买
  9.     void buyGood();
  10. }
  11. //-----------------------拆分------------------------
  12. public interface IGoodInfo{//接口1,商品信息接口
  13.     String getName();
  14.     String getDescription();
  15.     double getPrice();
  16. }
  17. public interface IGoodManage{
  18.     void buyGood();//接口2,商品操作接口
  19.     //退换等其他逻辑
  20. }
  21. //商品实现
  22. publci class IGoodImpl implements IGoodInfo,IGoodManage{
  23.     @Override
  24.     //.....
  25. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表