• 设计模式(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

      

       华为手机分为2G3G4G5G,我们来创建一个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() + "》" +
                    "
    原价:" + huaWei5GDiscount.getPrice() +
                    "
    售价:" + huaWei5GDiscount.getDiscountPrice());
        }
    }
    View Code

     

     类结构图:

  • 相关阅读:
    Java利用QRCode.jar包实现二维码编码与解码
    javax.servlet不存在问题的解决
    订单号生成规则
    Koa处理url
    网站追踪技术:前端持久化evercookie
    网站追踪技术:“帆布指纹识别”canvas fingerprinting
    Typescript类、命名空间、模块
    TypeScript 基础类型、变量声明、函数、联合类型、接口
    webpack中的hash、chunkhash、contenthash区别
    不刷新网页修改url链接:history.pushState()和history.replaceState()新增、修改历史记录用法介绍
  • 原文地址:https://www.cnblogs.com/weibanggang/p/13417474.html
Copyright © 2020-2023  润新知