【设计模式】软件设计七大原则 ( 开闭原则 )

举报
韩曙亮 发表于 2022/01/11 00:20:29 2022/01/11
【摘要】 文章目录 一、开闭原则简介二、开闭原则代码示例1、商品接口2、普通商品类3、折扣商品类4、测试类 一、开闭原则简介 开闭原则 : 定义 : 一个 软件实体 ,...





一、开闭原则简介



开闭原则 :

  • 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 扩展 开放 , 对 修改 关闭 ;
  • 抽象与实现 :抽象 构建框架 , 用 实现 扩展细节 ;
  • 优点 : 提高 软件系统 的 可复用性 及 可维护性 ;

开闭原则 是 面向对象 设计 中 , 最基础的 设计原则 , 它指导我们建立稳定灵活的系统 ;

开发新功能时 , 尽量 不修改原有的代码 , 尽量 使用扩展增加新功能 ;


实现 开闭原则 的核心思想 是面向抽象编程 , 不是面向实现编程 ;

定义的 对象类型 抽象类类型 或 接口类型 , 调用的方法抽象类 或 接口 中的方法 ;


抽象是 稳定的 , 让类依赖于抽象 , 对于修改来说就是封闭的 ;

通过 面向对象 的 继承 , 以及 多态机制 , 可以实现 对 抽象 的 继承 , 通过 重写改变其固有方法 , 或 实现新的扩展方法 ;





二、开闭原则代码示例




1、商品接口


package openclose;

/**
 * 商品接口
 */
public interface IGood {
    Integer getId();
    String getName();
    Double getPrice();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2、普通商品类


package openclose;

/**
 * 普通的商品类
 */
public class NormalGood implements IGood {
    private Integer id;
    private String name;
    private Double price;

    public NormalGood(Integer id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Override
    public Integer getId() {
        return this.id;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public Double getPrice() {
        return this.price;
    }

    @Override
    public String toString() {
        return "NormalGood{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

3、折扣商品类


如果要添加一个商品打折功能 , 不能直接修改 IGood 接口 , 或 NormalGood 类 , 只要修改了 , 就给之前的功能带来了隐患 ;

根据开闭原则 , 对修改关闭 , 对扩展开放 ;

这里直接定义 NormalGood 类的子类 , 在继承 NormalGood 类的基础上 , 开发扩展的新功能 ;

package openclose;

/**
 * 打折商品类
 * 加入一个 商品 打折的功能
 *      不能直接修改 IGood 接口 , 或 NormalGood 类
 *      只要修改了 , 就给之前的功能带来了隐患
 * 这里直接定义 NormalGood 类的子类
 *      在继承 NormalGood 类的基础上 , 开发扩展的新功能
 */
public class DiscountGood extends NormalGood {

    public DiscountGood(Integer id, String name, Double price) {
        super(id, name, price);
    }

    @Override
    public Double getPrice() {
        return super.getPrice() * 0.5;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

4、测试类


package openclose;

public class Main {
    public static void main(String[] args) {
        IGood normalGood = new NormalGood(8, "普通商品", 88.0);
        System.out.println("商品信息 : " + normalGood);

        IGood discountGood = new DiscountGood(9, "Java 折扣课程", 88.0);
        System.out.println("折扣商品信息 : " + discountGood + " , 折扣价格 : " + discountGood.getPrice());
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

执行结果 :

商品信息 : NormalGood{id=8, name='普通商品', price=88.0}
折扣商品信息 : NormalGood{id=9, name='Java 折扣课程', price=88.0} , 折扣价格 : 44.0

  
 
  • 1
  • 2

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119876173

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。