首页 > 其他分享 >设计模式六大原则(二)--开闭原则

设计模式六大原则(二)--开闭原则

时间:2024-08-19 15:51:35浏览次数:14  
标签:原则 -- 可维护性 开闭 int 软件 设计模式 public

1. 简介

1.1. 概述

开闭原则(Open/Closed Principle,简称OCP)是软件设计原则中的一个重要原则,它指出:“软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。”这意味着我们应该设计出这样的软件实体,它们可以在不改变原有代码的基础上进行扩展和修改。

开闭原则的核心思想是将变化的部分隔离出来,使得在不影响其他部分的情况下,可以对系统进行扩展和修改。这样做的好处在于提高了软件的可维护性和可重用性,同时也降低了软件的耦合度。

1.2. 主要特点

开闭原则(Open/Closed Principle,简称OCP)的主要特点如下:

  • 对扩展开放 :这意味着软件实体(如类、模块、函数等)应该允许新的功能加入,而不必修改现有的代码。这使得系统具有更好的可扩展性和灵活性。

  • 对修改封闭 :这意味着软件实体一旦设计完成,就可以独立完成其工作,而不需要对已有代码进行任何修改。这有助于提高软件的稳定性、可靠性和可维护性。

  • 封装变化 :开闭原则强调将变化的部分封装起来,使得在不影响其他部分的情况下,可以对系统进行扩展和修改。这样可以降低软件的耦合度,提高其可维护性和可重用性。

  • 使用抽象接口 :在实现开闭原则时,通常需要定义一个抽象接口,以便在不修改原有代码的基础上,对系统进行扩展和修改。抽象接口可以提供一个统一的接口,使得各种具体实现可以相互协作。

  • 实现具体类 :在实现开闭原则时,需要定义一些具体类,它们可以根据抽象接口提供的方法来实现具体的功能。具体类可以使得系统更加灵活和可扩展。

  • 实现适配器 :适配器是一种设计模式,它可以帮助我们将现有的系统与新的系统进行对接。在实现开闭原则时,适配器可以使得不同的系统之间实现无缝的对接,提高系统的可扩展性和可维护性。

2. 优缺点

2.1. 优点

  • 提高软件的可维护性 :遵循开闭原则可以使得软件系统更加灵活和可扩展,从而提高软件的可维护性和可重用性。

  • 降低软件的耦合度 :通过将变化的部分封装起来,可以降低软件各部分之间的耦合度,使得各个组件之间相互独立,互不影响。

  • 适应变化的需求 :开闭原则使得软件系统可以更好地适应变化的需求,可以通过添加新的功能模块来扩展系统的功能,而不需要修改现有的代码。

  • 提高软件的稳定性 :遵循开闭原则可以使得软件系统的各个组件之间相互独立,互不影响,从而提高软件的稳定性。

2.2. 缺点

  • 可能增加系统的复杂性 :为了实现开闭原则,可能需要设计更多的抽象接口和具体类,这可能会增加系统的复杂性和设计难度。

  • 可能降低系统的性能 :在实现开闭原则时,可能需要使用反射、动态代理等技术来实现代码的扩展和修改,这可能会降低系统的性能。

  • 可能增加系统的内存消耗 :为了实现开闭原则,可能需要创建更多的对象和类,这可能会增加系统的内存消耗。

  • 可能降低系统的可读性 :为了实现开闭原则,可能需要设计更加复杂的类图和对象关系,这可能会降低系统的可读性和可理解性。

3. 详细介绍

3.1. Java代码

以下是一个完整的Java代码示例,展示了如何在Java中实现开闭原则。

public interface Calculator {
    public int calculate(int a, int b);
}

public class AddCalculator implements Calculator {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
}

public class SubtractCalculator implements Calculator {
    @Override
    public int calculate(int a, int b) {
        return a - b;
    }
}

public class MainProgram {
    public static void main(String[] args) {
        String operation = "add";
        Calculator calculator = null;
        
        if (operation.equals("add")) {
            calculator = new AddCalculator();
        } else if (operation.equals("subtract")) {
            calculator = new SubtractCalculator();
        }
        
        if (calculator != null) {
            int result = calculator.calculate(10, 5);
            System.out.println("Result: " + result);
        } else {
            System.out.println("Invalid operation.");
        }
    }
}

在这个示例中,我们通过将变化的部分封装起来,使得在不修改原有代码的基础上,可以对系统进行扩展和修改。这样可以降低软件的耦合度,提高其可维护性和可重用性。同时,我们也遵循了开闭原则,使得软件系统更加灵活和可扩展,从而提高软件的稳定性、可靠性和可维护性。

3.2. Python代码

以下是一个完整的Python代码示例,展示了如何在Python中实现开闭原则。

class Calculator:
    def calculate(self, a, b):
        pass

class AddCalculator(Calculator):
    def calculate(self, a, b):
        return a + b

class SubtractCalculator(Calculator):
    def calculate

标签:原则,--,可维护性,开闭,int,软件,设计模式,public
From: https://blog.csdn.net/yyt593891927/article/details/141327613

相关文章

  • 网易增强滑块验证码识别
    先来看看实际的滑动效果这款验证码和传统的相比,确实难度增加了不少。不仅要识别滑块位置,还要识别滑块的旋转角度。难度确实是上了一个台阶,而且只增加了机器的识别难度,真人去滑动还是很容易拼接成功的。网站在获取验证码的时候,会给我们一个attrs参数,我们就可以通过这个参数计......
  • IOS-计算机视觉与增强现实-全-
    IOS计算机视觉与增强现实(全)原文:ComputerVisionandAugmentedRealityiniOS协议:CCBY-NC-SA4.0一、计算机视觉导论本章将重点讨论什么是计算机视觉,我们为什么需要它,该技术的发展,它的不同应用,以及它如何用于增强现实。什么是计算机视觉?视觉是分析和解释感兴趣的场景和......
  • 第二周,linux基础_vim、grep、sed、shell
    总结学过的权限,属性及ACL相关命令及选项,示例。结合vim几种模式,学会使用vim几个常见操作。1)如何打开文件。并在打开文件(命令模式)之后如何退出文件。2)打开文件(命令模式)之后,进入插入模式。并在插入模式中如何回到打开文件的状态(命令模式),并在命令模式之后如何退出文件。3)打开文件......
  • 全志TinyVision芯片文章汇总
    全志TinyVision芯片TinyVision开发交流QQ群:821628986文章目录汇总教程共计14章,下面是章节汇总:第0章_TinyVision套件简述第1章_源码工具文档手册第2章_快速启动使用第3章_安装并配置开发环境第4章_选择合适系统第5章_Tina5Liunx开发第6章_TinalLinuxNPU开发第7......
  • 反序列化刷题(一)
    反序列化刷题web255将isvip改为true然后序列化echourlencode($v=serialize($f=newctfShowUser()));Cookie:O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3......
  • 第三周,linux基础_磁盘&网络
    磁盘存储术语总结:head,track,sector,sylinder.总结MBR,GPT结构。总结学过的分区,文件系统管理,SWAP管理相关的命令及示例(加注释),示例fdisk,parted,mkfs,tune2fs,xfs_info,fsck,mount,umount,swapon,swapoff总结raid0,1,5,10,01的工作原理。总结各自的利用率,......
  • Kafka--分布式MQ系统、日志系统
    简介:Kafka是由Linkedin(领英)开发的一个分布式、分区多副本、多订阅者、基于Zookeeper协调的分布式日志/MQ系统,于2010年贡献给Apache基金会并成为顶级开源项目。Kafka的特性#1、高吞吐、低延迟kafka最大的特点就是收发消息非常快,kafka每秒可以处理百万级别的消息,最低延迟......
  • CADMATIC许可证配置文件
    在数字化时代,CADMATIC软件已成为工程设计和制造业领域的核心工具。为了充分发挥CADMATIC软件的性能并确保合规性,合理的许可证配置文件设置至关重要。本文将为您揭示CADMATIC许可证配置文件的奥秘,帮助您优化软件性能并确保合规性,提升企业的竞争力。一、CADMATIC许可证配置文件的重......
  • 测试环境治理之MYSQL索引优化篇
    1治理背景测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:•环境不稳定,测试五分钟,排查两小时•基础建设不全,导致验证不充分,遗漏缺陷•多人共用,节点堵塞这些问题在行业内其实屡见不鲜,针对测试环境的治理,不得不引起......
  • Django 关系字段类型
    关系型数据库的关系包括三种类型:ForeignKey:一对多,将字段定义在多的一端中。#一个多对一的关系。需要两个位置参数:模型相关的类和on_delete选项。goods=models.ForeignKey('Goods',on_delete=models.CASCADE)ManyToManyField:多对多,将字段定义在任意一端中。use......