定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
问题由来:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修改关闭,并没有明确的告诉我们。以前,如果有人告诉我“你进行设计的时候一定要遵守开闭原则”,我会觉的他什么都没说,但貌似又什么都说了。因为开闭原则真的太虚了。
例子
定义一个接口,寻找美女
package com.loulijun.chapter6; public interface IFindGirl { //年龄 public int getAge(); //姓名 public String getName(); //长相 public String getFace(); //身材 public String getFigure(); }
实现这个接口
package com.loulijun.chapter6; public class FindGirl implements IFindGirl { private String name; private int age; private String face; private String figure; public FindGirl(String name, int age, String face, String figure) { this.name = name; this.age = age; this.face = face; this.figure = figure; } @Override public int getAge() { return age; } @Override public String getFace() { return face; } @Override public String getFigure() { return figure; } @Override public String getName() { return name; } }
场景:大街上
package com.loulijun.chapter6; import java.text.NumberFormat; import java.util.ArrayList; public class Street { private final static ArrayList<IFindGirl> girls = new ArrayList<IFindGirl>(); //静态初始化块 static { girls.add(new FindGirl("张含韵",23,"可爱型","165cm/47kg")); girls.add(new FindGirl("高圆圆",33,"时尚型","165cm/48kg")); girls.add(new FindGirl("章泽天",19,"清纯型","168cm/47kg")); } public static void main(String args[]) { System.out.println("----------美女在这里----------"); for(IFindGirl girl:girls) { System.out.println("姓名:" + girl.getName() + " 年龄:" + girl.getAge() + " 长相:" + girl.getFace() + " 身材:"+girl.getFigure()); } } }
运行结果:
----------美女在这里----------
姓名:张含韵 年龄:23 长相:可爱型 身材:165cm/47kg
姓名:高圆圆 年龄:33 长相:时尚型 身材:165cm/48kg
姓名:章泽天 年龄:19 长相:清纯型 身材:168cm/47kg
但是如果想独立分出一个外国美女的类别的话(比如增加一个国籍),可以通过修改接口、修改实现类、通过扩展来实现。
如果修改接口,也就意味着修改实现类,这样对项目的变动太大了,所以不推荐。
如果修改实现类,这样虽能解决问题,但是明显有些牵强,如果需要其他变动的时候会显得逻辑混乱
所以,通过扩展来实现是最简单的方式
如何扩展:
可以定义一个IForeigner接口继承自IFindGirl,在IForeigner接口中添加国籍属性getCountry(),然后实现这个接口即可,然后就只需要在场景类中做稍微修改就可以了
package com.loulijun.chapter6; public interface IForeigner extends IFindGirl { //国籍 public String getCountry(); }
实现接口
package com.loulijun.chapter6; public class ForeignerGirl implements IForeigner { private String name; private int age; private String country; private String face; private String figure; public ForeignerGirl(String name, int age, String country, String face, String figure) { this.name = name; this.age = age; this.country = country; this.face = face; this.figure = figure; } @Override public String getCountry() { // TODO Auto-generated method stub return country; } @Override public int getAge() { // TODO Auto-generated method stub return age; } @Override public String getFace() { // TODO Auto-generated method stub return face; } @Override public String getFigure() { // TODO Auto-generated method stub return figure; } @Override public String getName() { // TODO Auto-generated method stub return name; } }
然后在场景类中只需要修改如下代码即可,其他不变
girls.add(new ForeignerGirl("Avirl",28,"美国","性感型","160cm/45kg"));
不过这些设计原则到不是绝对的,而是根据项目需求,实际需求来定夺使用
相关推荐
开闭原则是面向对象设计中的一个核心原则,它在JAVA设计模式中占据着重要的地位。这一原则由格里·贝斯提出,旨在指导开发者如何设计可维护和可扩展的软件系统。开闭原则(Open-Closed Principle,OCP)的核心思想是...
开闭原则是面向对象设计中的一个基本原则,它由软件工程专家 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出。这个原则的核心思想是“对扩展开放,对修改关闭”。简单来说,就是模块应该...
里氏替换原则是面向对象编程中一项极其重要的原则,它不仅有助于确保代码的健壮性和可维护性,而且也是实现其他设计原则如开闭原则的基础。通过遵循LSP,我们可以设计出更加优雅、简洁且易于扩展的软件系统。希望...
开闭原则是面向对象设计的核心原则之一,它的全称是"对扩展开放,对修改关闭",即在软件设计过程中,我们希望系统能够容易地添加新功能,同时保持原有代码的稳定性,避免频繁修改。这一原则由 Bertrand Meyer 在他的...
JAVA开闭原则是一种重要的软件设计思想,其核心理念在于提高软件系统的灵活性、稳定性和可维护性。开闭原则强调“对扩展开放,对修改关闭”,即在设计阶段应该确保软件模块能够在不修改原有代码的基础上,通过扩展的...
2. 开闭原则:对扩展开放,对修改关闭,意味着在不修改原有代码的基础上增加新功能。 3. 里氏替换原则:子类必须能够替换掉它们的基类,不影响程序的正确性。 4. 接口隔离原则:避免使用宽泛的接口,尽量细化接口,...
设计模式6大原则:开闭原则
5 开闭原则-The Open-Closed Principle (OCP) 二 包的设计原则 6 重用发布等价原则-Release Reuse Equivalency Principle (REP) 7 无环依赖原则-The Acyclic Dependencies Principle (ADP) 8 稳定依赖...
开闭原则(Open-Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它在软件工程领域具有举足轻重的地位。该原则由 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出,旨在提高...
在软件开发中,开闭原则是面向对象设计中最基础的设计原则之一,它指导我们如何建立稳定灵活的系统。开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。然而,开闭原则仅仅告诉我们对扩展开放...
- **开闭原则**:软件实体应对扩展开放,对修改关闭,意味着应通过扩展而不是修改现有代码来实现新功能。 - **里氏替换原则**:子类型必须能够替换它们的基类型,并且不破坏原有程序的正确性。 - **接口隔离原则*...
开闭原则(Open-Closed Principle,OCP)是软件工程中的一个基本原则,由Bertrand Meyer在1988年提出,它是面向对象设计的核心之一。这个原则规定了软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这...
开闭原则是面向对象设计的基本原则之一,由勃兰特·梅耶在1988年提出。这个原则的核心思想是:软件实体(如模块、类、接口和方法)应该对扩展开放,对修改关闭。这意味着在需求变更时,我们可以通过增加新代码来扩展...
读书笔记:设计原则开闭原则
面向对象设计的原则主要有四个:单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)和依赖倒置原则(Dependency...
书中还提到了六大设计原则,包括单一职责原则(Single Responsibility Principle)、里氏替换原则(Liskov Substitution Principle)、依赖倒置原则(Dependency Inversion Principle)、接口隔离原则(Interface ...
本资源首先介绍了设计模式的六大原则,包括单一责任原则、开闭原则、里氏替换原则、接口隔离原则、合成复用原则和最少知道原则。然后,资源对23种设计模式进行了分类和总结,包括创建型模式、结构型模式和行为型模式...
在软件设计中,OCP 开闭原则是其中一个非常重要的设计原则。该原则定义了一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。也就是说,当软件需要变化时,应该尽量通过扩展软件实体的行为来实现变化,而...