您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——开闭原则

小志的博客 发布时间:2020-05-02 18:55:03 ,浏览量:0

一、概念

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课程类的功能,尽量通过扩展软件实体的行为类实现变化,而不是通过修改已有代码来实现变化。

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0630s