首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计原则——开闭原则

什么是开闭原则? 在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即应当可以在不必修改源代码的情况下改变这个模块的行为。 如何运用开闭原则?...开闭原则解决问题的关键在于抽象化,把系统所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征,给系统定义出一个一劳永逸,不再修改的抽象设计,此设计允许有无穷尽的行为在实现层被实现...在JAVA中可以定义一个或多个抽象Java类或Java接口,规定出所有的具体类必须提供的方法的特征作为系统设计的抽象层。...作为系统设计的抽象层,要预见所有可能的扩展,因此在任何扩展情况下系统抽象底层不需要修改。同时,由于抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的。...遵守开闭原则进行如下改变 打折类: public class OffNovelBook extends NovelBook { public OffNovelBook(String name

8000

面向对象的设计原则-开闭原则

Open-Closed Principle,"开闭原则"百科上是这么说的:一个软件实体(如类、模块、函数)应该对扩展开放,对修改关闭。 为什么?...开闭原则是面向对象设计原则中最基础的原则,可称之为原则的原则,也可以说是原则的指导思想,它强调的是既稳定又灵活,在不修改源代码的情况下又增加了新功能,核心思想是面向抽象编程。..."开闭原则是抽象类,其他五大原则是具体的实现类。"对测试的影响,可以提高复用性,提高可维护性,面向对象开发的要求。 怎么用?...(来说说抽象,抽象是对一组事物的通用描述,它没有具体的实现,也就表示它有很多的可能性,在程序语言中抽象表现为在接口或抽象类定义一些可变的行为,并且能够实现对扩展开放,其包含三层含义: 第一,通过接口或抽象类约束扩展...最后再说说封装变化,包含两层含义: 将相同的变化封装到一个接口或抽象类中; 将不同的变化封装到不同的接口或抽象类中;

51440
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    设计原则:面向对象设计原则详解

    应用程序的复用可以提高应用程序的开发效率和质量,节约开发成本,恰当的复用还可以改善系统的可维护性。而在面向对象的设计里面,可维护性复用都是以面向对象设计原则为基础的,这些设计原则首先都是复用的原则。...遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。 面向对象设计原则和设计模式也是对系统进行合理重构的指导方针。...(高内聚、低耦合) 一个类应该只包含单一的职责,并且该职责被完整地封装在一个类中。...3、接口隔离和单一职责的区别: 范围区别:单一职责原则是针对模块、类、接口的设计,接口隔离原则相对单一职责更侧重接口的设计。...2、原则分析: 1)如果说开闭原则是面向对象设计的目标,依赖倒转原则是到达面向设计"开闭"原则的手段..如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则.

    2.6K30

    设计原则

    在依赖倒置原则中的倒置指的是和一般的OO设计的思考方式完全相反。如果说设计一个比萨店,我们应该从上往下思考,先要有一个比萨店,然后比萨点根据要求生产出具体类型的比萨。...依赖倒置的设计方式: ? 最少知识原则 不要让太多类耦合在一起,免得修改系统的一部分,会影响到另外一部分。 ? ?...内聚 当来一个类或者一个模块被设计成只支持一组相关功能的时候,我们说它具有高内聚。反之,当被设计成支持一组不相关的功能时,我们说它具有低内聚。...里氏替换原则 在代码里面, 把父类替换成它的子类, 程序的行为不会有变化, 简单地说, 子类型必须能够替换掉它们的父类型。...里氏替换原则为继承定义的规范: 子类必须完全实现父类的方法 子类可以有自己的新方法、新属性

    53540

    Linkerd的设计原则

    作者:William Morgan tl;dr:服务网格需要设计原则吗?我们是这样认为的。我们围绕三个核心原则构建了Linkerd 2.0,这些原则旨在降低运行服务网格的操作成本,尤其是对人类而言。...从JVM到Rust的迁移是Linkerd 2.0成功的一个重要部分,但是同样重要的是,我们决定为2.0编写一组核心产品设计原则。...这些代价是配置、理解、调优和操作Linkerd 1.x所花费的时间。 为了解决这个问题,我们的2.0设计过程从写下一组设计原则开始,这些原则将确保我们面向用户做对的事。这些原则很简单: 保持简单。...无论它是通过计算资源来度量的,还是更重要的,在人类花费的时间中度量的,这些原则都要求Linkerd忠实于保持服务网格运行成本尽可能低的目标。...有关这些原则的更多细节和一些实际应用的示例,请参阅Linkerd设计原则文档。

    36930

    设计原则

    一、面向对象应用程序开发原则(SOLID) 1单一职责原则(SRP) 定义: 一个类应该只有一个发生变化的原因。这条原则曾被称为内聚性,即一个模块的组成元素之间的功能相关性。 为什么要遵守这条原则?...如果一个类承担的职责过多,就等于把这些职责耦合到了一起。一个职责的变化可能削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。...为什么要遵循此原则? 我们要遵循OCP原则,OCP背后的机制是抽象和多态,支持抽象和多态的关键机制是继承(比如C#是这样),那么是什么设计规则支配着这种继承用法?最佳的继承层次特征是什么?...这样高层组件与低层组件之间通过抽象的接口来交换而不是具体类。该原则是框架设计的核心。 为什么要遵守此原则?...三、控制反转(IoC) 控制反转是基于面向对象的原则,提倡松耦合理念的设计原则,允许独立开发应用程序的各个组件。 实现方式 实现方式有两种:依赖注入,服务定位。

    76771

    设计原则之开闭原则

    所谓对扩展开放,对修改关闭,其实是设计模式里面所重点提倡的,后续所有涉及模式的介绍其实都是为了程序能够更好的扩展,提倡设计模式的本质就是为了减少 增加一点功能而修改系统的主要逻辑!...尽量通过扩展类的操作来实现行为变化,而不是通过修改已有代码来实现修改 错误的示范 下面还是老规矩,我们先看一段错误的代码!...StringFormatUtil.stringFormat(MSG)); } } 程序必须首先让人类理解,然后顺便让机器能执行^_^xxxx Process finished with exit code 0 总结 通过上述代码可以知道,开闭原则是是为了避免过多的修改原有的代码逻辑...,用扩展代替修改而衍生的一个原则,不可否认,他也是所有的设计模式都想表达的一个结果,高扩展性。...对拓展开放是为了应对变化(需求),对修改关闭是为了保证已有代码的稳定性;最终结果是为了让系统更有弹性! 开闭原则也并不是免费的。有些情况下,代码的扩展性会跟可读性相冲突。

    64430

    设计原则

    设计原则 ? 有句古老的谚语说:“愚弄我一次,应该羞愧的是你。再次愚弄我,应该羞愧的是我。”这也是一种有效的对待软件设计的态度。为了防止软件背着不必要的复杂性,我们会允许自己被愚弄一次。...——《敏捷软件开发原则、模式与实践》 好的代码永远是需要设计的。一名高级程序员,更应该有设计师的潜质,不只是关注怎么用代码实现业务,更关注的是代码的设计。...JavaScript用得上设计原则有单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、合成复用原则和最少知识原则等。本文将选取三个常用的阐述之。...需要明确的是:设计原则只是一种指导,没有哪条原则是在实际开发中必须遵守的。但善用原则,可以帮助更好地设计代码。 1 单一职责原则(srp) 概述 定义:就一个类而言,应该仅有一个引起它变化的原因。...很多时候,一个程序具有良好的设计,往往说明它是符合开放封闭原则的。

    56320

    设计模式中的设计原则

    先来抛一个问题,设计模式到底有几个原则? 翻了三本书《设计模式之禅》、《设计模式:可复用的面向对象软件元素》、《Head First 设计模式》,也看了不少博客和关于设计模式原则的文章。...关于设计模式有几大原则,似乎没有严格的定论,有的说6大设计原则,有的说7大设计原则,《Head First》中更是提到了9个设计原则。...不管是多少个设计原则,最终都是希望程序达到 **“高内聚,低耦合” **,代码高度复用,具有可维护性的目的。所以多少个设计原则已经不重要了,重要的是达到怎样的目标!...设计原则 我觉得7大设计原则都有必要了解和尽量向其靠拢,但是程序设计肯定是不可能完全遵守这些设计原则,但是我们的设计可以让程序更好扩展和更容易维护。...所以说,开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。 开闭原则是面向对象设计中最基础的设计原则,它也被称为设计总则,它指导我们如何建立稳定灵活的系统。

    76730

    设计原则(1)| 开闭原则

    这些操作都是通过「修改」来实现新功能的,不符合「开闭原则」。 如果我们要遵循「开闭原则」,必须对修改关闭,对扩展开放。...我的理解是不需要刻意遵守。 你只需要头脑中有这个印象就行了,你需要知道的就是你的代码需要具有一定的扩展性。所有的设计原则都只有一个最终归宿——不破坏原有代码的正常运行,方便扩展。...随着你的理论知识和实战经验的提高,同时对业务有了足够了解,你在设计代码结构时会很自然地向未来靠拢(这需要稍加练习,这种技能不是单纯靠工作时长就能获得的),识别出未来可能会发生的扩展点。...但是想识别出所有可能的扩展点既不可能也没必要,最合理的做法是对一些比较确定的、短期内可能会发生的需求进行扩展设计。...还是那句话,设计原则和设计模式不是金科玉律,只要适合当前需求,并具备一定弹性的设计就是好设计。要平衡代码扩展性和可读性,切勿滥用设计原则和设计模式,牺牲代码的可读性。

    59020

    面向对象的设计原则-依赖倒置原则

    Dependence Inversion Principle,DIP"依赖倒置原则",依赖倒置的原始定义是: Hign level modules should not depend...; 高层模块依赖抽象层:高层模块基于抽象层编程; 低层模块依赖抽象层:低层模块继承或者实现抽象层; 细节:实现接口或者继承抽象类而产生的类; 模块间的依赖通过抽象发生...,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的;接口或者抽象类不依赖于实现类;实现类依赖接口或者抽象类,核心思想是面向接口编程; 采用依赖倒置原则可以减少类之间的耦合性,...提高系统的稳定性; 举个例子: ?...最佳实践 依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块彼此独立,不互相影响,实现模块间的松耦合,我们在项目中应该尽量做到: 1.每个类尽量都有接口或者抽象类,或者抽象类和接口两者都具备

    70310

    设计模式 -- 设计原则

    终极目的 稳定、灵活、健壮 实现手段 低耦合、高内聚 设计原则 [设计原则.PNG] 单一职责 & 接口隔离 单一职责 侧重于职责 接口隔离 侧重于业务逻辑 开闭原则 Define: Software...上面的定义描述的很虚,不像另外五条原则一样,有比较实际的描述。...但是却是比较基础的原则之一,他的影子在其他原则的实践中也总是可以看到,笔者的理解,他就是一个精神领袖,是最基本的原则,也是所有原则的集大成的体现。...更多 实现拥抱变化的方法远不止于上面所述的6种原则,但是这这6条原则可以应对大部分情况;更重要的是,脱离业务的设计都是耍流氓,严格死扣某一条原则,是一条不归路 书籍推荐 《设计模式之禅》

    57350

    面向对象的设计原则-里氏替换原则

    "里氏替换原则"是类的设计原则之一,我们使用"3H"学习法对其进行拆解; why(目的):为什么要学习"里式替换原则",我们都知道面向对象的三大特性:封装、继承、多态,该原则就是对良好的"继承关系...接下来我们开始进行具体的学习; 概念:LSP,"里式替换原则",凡是在父类出现的场景中,将父类替换为子类,程序逻辑不变,反之则未必可以。...1.子类需要实现父类的抽象方法 2.子类尽量不要重写或覆盖父类中已经实现的方法 3.子类重载父类方法时,子类输入参数>=父类输入参数&子类输出参数<=父类输出参数 4.子类可以添加自己特有的新方法,原则上不建议...LSP经典例子:正方形和长方形不符合里式替换,设置宽、高后,长方形的体积=宽*高,正方形体积=高*高,子类无法替换父类,不符合里氏替换原则; 在策略模式中,客户端类依赖抽象父类,场景类使用时传入具体的策略子类...,子类都实现了父类的抽象接口,可以互换,这就符合里式替换原则;

    86130

    设计模式——设计原则

    设计原则 程序开发不仅要知道设计模式还要知道设计的原则,尽最大能力按照原则设计开发,对于代码review或者修改后期项目以及项目交接都会很方便。...一、单一职责原则 有且仅有一个原因引起类的变更。 优点: 类的复杂性降低,实现什么职责都有明确的定义; 可读性提高; 可维护性提高; 变更引起的风险降低。...二、里氏替换原则 所有引用基类的地方必须能透明使用其子类的对象。只要父类能出现的地方,子类就可以出现,而且替换子类也不会产生错误。...四、接口隔离原则 客户端不应依赖它不需要的接口,对接口进行细化;类建的依赖关系应该建立在最小的接口上。建立单一接口,不要建立臃肿庞大的接口。而且要满足单一职责原则。...六大设计原则主要是Java面向对象编程设计的原则,降低项目耦合,分清职责。方便开发和继续维护。 ----

    61360

    设计模式原则:开放封闭原则

    开放封闭原则 开放封闭原则表示一个软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。也就是说,一个软件实体应该在不修改原有代码的前提下,可以扩展新的功能。...开放封闭原则是设计模式的核心原则,它体现了软件的灵活性和稳定性。如果一个软件能够满足开放封闭原则,那么它就具有以下两个优点: 能够扩展已有的功能,满足新的需求,具有很强的适应性和灵活性。...不需要修改已有的代码,保证了原有功能的稳定性和可靠性。 举个例子,假设我们有一个计算器类 Calculator,它可以根据用户输入的表达式进行计算。...为了遵循开放封闭原则,我们应该将 Calculator 类设计成一个抽象类,并定义一个抽象方法 calculate()。...这样,如果我们想要增加新的运算符,只需要增加一个新的子类即可,不需要修改原有的代码。

    18540

    Java设计原则—开闭原则(转)

    开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统。 定义: 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。...软件实体包括以下几个部分: 项目或软件产品中按照一定的逻辑规则划分的模块 抽象和类 方法 开闭原则是为软件实体的未来事物而制定的对现行开发设计进行约束的一个原则。...变化的类型: 逻辑变化 子模块变化 可见试图变化 一个项目的基本路径应该是这样的:项目开发、重构、测试、投产、运维,其中的重构可以对原有的设计和代码进行修改,运维尽量减少对原有代码修改,保持历史代码的纯洁性...开闭原则的重要性: 开闭原则对测试的影响 开闭原则可是保持原有的测试代码仍然能够正常运行,我们只需要对扩展的代码进行测试就可以了。...开闭原则可以提高复用性 在面向对象的设计中,所有的逻辑都是从原子逻辑组合而来的,而不是在一个类中独立实现一个业务逻辑。只有这样代码才可以复用,粒度越小,被复用的可能性就越大。

    23320

    设计模式原则:依赖倒置原则

    依赖倒置原则 依赖倒置原则表示高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。也就是说,要针对接口编程,而不是针对实现编程。...依赖倒置原则是面向对象设计的重要原则之一,它体现了面向对象的思想和封装的特性。如果一个软件能够遵循依赖倒置原则,那么它就具有以下两个优点: 降低了类之间的耦合性,提高了系统的稳定性。...keyboard.input(); mouse.click(); System.out.println("电脑工作"); } } 这个类违反了依赖倒置原则...这样的设计有以下几个缺点: 类之间的耦合度高,如果 Keyboard 类或者 Mouse 类发生变化,就需要修改 Computer 类的代码。...为了遵循依赖倒置原则,我们应该将 Keyboard 类和 Mouse 类设计成实现一个共同的接口 Component。

    17120

    java设计原则--里氏替换原则

    java的核心特性之一:继承,Java中的继承时单继承,子类继承了父类后就可以使用父类的属性和方法(私有属性和方法以外),子类需要重写父类的抽象方法,继承机制在一定程度上提高了代码的复用性,提高了代码的可拓展性...,但也是有缺点 继承缺点 缺点一:继承时侵入性的,也就是说子类继承了父类就必须拥有父类所有的属性和方法 缺点二:灵活性降低,子类必须拥有父类的属性和方法,让子类多了些约束 缺点三:增强了耦合性,当父类的常量...、变量和方法被修改时需要考虑子类的修改 里式替换作用 Java的单继承机制从总体上看是利大于弊,那么,如何让利的优势发挥最大,同时减少弊的带来的麻烦呢,于是就有了里式替换原则,里氏替换原则为良好的继承定义了一个规范...我们在做系统设计时,经常会定义一个接口或抽象类,然后编码实现,调用类则直接传入接口或抽象类,其实这里已经使用了里氏替换原则 举一个CS的案例: 枪的主要职责是射击,如何射击在各个具体的子类中定义,...注意 在类中调用其他类时务必要使用父类或接口,如果不能使 用父类或接口,则说明类的设计已经违背了LSP原则 本文内容参考设计模式之禅,仅用于个人学习,如有不妥请联系删除

    86120

    设计模式原则:里氏替换原则

    里氏替换原则 里氏替换原则表示如果对每一个类型为 S 的对象 o1 都有类型为 T 的对象 o2 ,使得以 T 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时 ,程序 P 的行为没有发生变化...里氏替换原则是继承复用的基础,它体现了子类和父类之间的关系。...如果一个软件能够遵循里氏替换原则,那么它就具有以下两个优点: 保证了父类的抽象性和可复用性,子类可以扩展父类的功能,但不会破坏父类的约束和规范。...这个类就违反了里氏替换原则,因为它改变了父类的行为含义,使得在程序中无法将 Bird 对象替换 Animal 对象,而不改变程序的逻辑。...,我们应该将 Animal 类设计成一个抽象类,并定义一个抽象方法 move()。

    21430
    领券