设计模式(1)-- 七大软件设计原则-开闭原则

前言

 

  学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。

开闭原则Open-Closed Principle, OCP)

  定义 : 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭,开闭原则也是其他五个原则的基石

 

  开闭原则是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。

  开闭原则是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统,例如:我们版本更新,我尽可能不修改源代码,但是可以增加新功能。

  在现实生活中对于开闭原则也有体现。比如,很多互联网公司都实行弹性制作息时间,规定每天工作 8 小时。意思就是说,对于每天工作 8 小时这个规定是关闭的,但是你什么时候来,什么时候走是开放的。早来早走,晚来晚走。

  下面我们以华为手机为例,首先创建一个华为手机接口:IHuaWei:

package com.wbg.dpsp.openClose;

/**
 * @author WBG
 * @date 2020/8/2 0:14
 * @describe 华为手机
 */
public interface IHuaWei {
    String getUUID();//主键
    String getName();//名称
    Double getPrice();//价格
}
View Code

 

 

  

 

   华为手机分为2G\3G\4G\5G,我们来创建一个G5手机

package com.wbg.dpsp.openClose;

/**
 * @author WBG
 * @date 2020/8/2 0:23
 * @describe //华为5G
 */
public class HuaWei5G implements IHuaWei {
    private String UUID;
    private String name;
    private Double price;

    public HuaWei5G() {
    }

    public HuaWei5G(String UUID, String name, Double price) {
        this.UUID = UUID;
        this.name = name;
        this.price = price;
    }

    public String getUUID() {
        return this.UUID;
    }

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

    public Double getPrice() {
        return this.price;
    }
}
View Code

 

  

 

 

 华为5G需要做一个活动,价格优惠,如果修改HuaWei5G中的getPrice()方法,则会影响其他地方调用,我们如何在不修改原有代码前提前下,实现价格优惠这个功能呢?现在,我们再写一个处理优惠逻辑的类:HuaWei5GDiscount

package com.wbg.dpsp.openClose;

/**
 * @author WBG
 * @date 2020/8/2 0:25
 * @describe 华为5G促销活动
 */
public class HuaWei5GDiscount extends HuaWei5G {

    public HuaWei5GDiscount() {
        super();
    }

    public HuaWei5GDiscount(String UUID, String name, Double price) {
        super(UUID, name, price);
    }

    //打折活动
    public Double getDiscountPrice() {
        //六折优惠
        return super.getPrice() * 0.85;
    }
    
}
View Code

 

 

测试结果:

package com.wbg.dpsp.openClose;

/**
 * @author WBG
 * @date 2020/8/2 0:30
 * @describe
 */
public class Test {
    public static void main(String[] args) {
        IHuaWei iHuaWei = new HuaWei5GDiscount("202008020031001","华为麦芒 9",2199.00);
        HuaWei5GDiscount huaWei5GDiscount = (HuaWei5GDiscount) iHuaWei;
        System.out.println("手机标识号:" + huaWei5GDiscount.getUUID() +
                "手机名称:《" +  huaWei5GDiscount.getName() + "》" +
                "\n原价:" + huaWei5GDiscount.getPrice() +
                "\n售价:" + huaWei5GDiscount.getDiscountPrice());
    }
}
View Code

 

 

 

 类结构图:

 

posted @ 2020-08-02 00:59  韦邦杠  阅读(572)  评论(0编辑  收藏  举报