java设计模式——开闭原则

一、概念

1、定义:

  • 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节

2、简单理解定义:

  • 当软件需要变化时,尽量通过扩展软件实体的行为类实现变化,而不是通过修改已有代码来实现变化

3、优点:

  • 提高软件系统的可复用性及维护性

二、开闭原则简单示例

1、示例1

  • 不使用开闭原则,j计算出课程的id、名称和价格

(1)、定义一个课程接口

package com.rf.rules;

/** 
* @Description: 定义一个课程接口
* @Param:  
* @Author: xz  
* @return: 
* @Date: 2020/5/2 17:42  
*/ 
public interface ICourse {

    //获取课程id
    Integer getId();
    //获取课程名称
    String getName();
    //获取课程价格
    Double getPrice();

}

(2)定义一个java课程类实现课程接口,并重写方法

package com.rf.rules;

/**
 * @description: java课程类实现课程接口,并重写方法
 * @author: xiaozhi
 * @create: 2020-05-02 17:43
 */
public class JavaCourse implements ICourse{

    private Integer id;
    private String name;
    private Double price;

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

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

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

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

(3)定义一个测试类,测试获取课程相关信息

package com.rf.rules;

/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-02 17:58
 */
public class Test {
    public static void main(String[] args) {
        ICourse iCourse=new JavaCourse(1,"java课程",300d);
        System.out.println("java课程id:"+iCourse.getId()+" \n"+"java课程名称:"+iCourse.getName()+" \n"+"java课程价格:"+iCourse.getPrice());
}

(4)输出结果如下:
在这里插入图片描述
2、示例2:

  • 使用开闭原则,在不改变示例1的代码基础上,计算出打折后的java课程价格

(1)、定义一个课程接口

package com.rf.rules;

/** 
* @Description: 定义一个课程接口
* @Param:  
* @Author: xz  
* @return: 
* @Date: 2020/5/2 17:42  
*/ 
public interface ICourse {

    //获取课程id
    Integer getId();
    //获取课程名称
    String getName();
    //获取课程价格
    Double getPrice();

}

(2)、定义一个java课程类实现课程接口,并重写方法

package com.rf.rules;

/**
 * @description: java课程类实现课程接口,并重写方法
 * @author: xiaozhi
 * @create: 2020-05-02 17:43
 */
public class JavaCourse implements ICourse{

    private Integer id;
    private String name;
    private Double price;

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

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

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

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

(3)定义一个java的扩展类,java的折扣价格课程(在示例1的基础上多了一个java折扣价格类)

package com.rf.rules;

/**
 * @description: java的扩展类,java的折扣价格课程
 * @author: xiaozhi
 * @create: 2020-05-02 18:02
 */
public class JavaDiscountCourse extends JavaCourse{

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

    //获取java打8折的折扣价
    @Override
    public Double getPrice(){
        return  super.getPrice()*0.8;
    }
    //获取原价
    public Double getOriginPrice(){
        return super.getPrice();
    }
}

(4)定义一个测试类,测试获取课程相关信息及折扣的价格

package com.rf.rules;

/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-02 17:58
 */
public class Test {
    public static void main(String[] args) {
      
        ICourse iCourse=new JavaDiscountCourse(1,"java课程",300d);
        JavaDiscountCourse javaDiscountCourse=(JavaDiscountCourse)iCourse;
        System.out.println("java课程id:" + javaDiscountCourse.getId() + " \n" + "java课程名称:" + javaDiscountCourse.getName() + " \n" + "java课程原价格:" + javaDiscountCourse.getOriginPrice() + " \n" + "java课程折扣价格:" + javaDiscountCourse.getPrice());
    }
}

(5)输出结果如下:
在这里插入图片描述

三、类之间关系图如下:

在这里插入图片描述

四、理解开闭原则定义

当我们的java课程类(JavaCourse)增加折扣价格功能的时候,通过创建一个java折扣课程类(JavaDiscountCourse)来扩展java课程类的功能,尽量通过扩展软件实体的行为类实现变化,而不是通过修改已有代码来实现变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小志的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值