设计原则之开闭原则
(1)开闭原则:
开闭原则(Open Closed Principle , OCP)是指“软件实体应当对扩展开发,对修改关闭(Software entities should be open for extension , but close for modification )” 此概念是大牛Bertrand Meyer于1988年提出。
“Open for extension ” 意味着模块的行为是可以扩展的。
“Close for modification” 意味着对模块行为进行扩展时,不必改变模块源代码或二进制代码。
简而言之,开闭原则:可以根据需求随意增加新的类,但是不要修改原有的类。
(2)开闭原则设计系统时的优点:
*可扩展程度高,非常灵活。
*可维护性强,无需改动源代码。
(3)如何实现开闭原则:
实现开闭原则的核心在于“抽象”。系统设计时,要区分哪些是变化的部分,哪些是不变的部分。对不变的部分,可以抽象为不变的接口;对于变化的部分,可以进行评估和分类,每个可变的因素都单独进行封装。
例子:
接口定义:
package org.yjY.ocp.interfaceOcp;
public interface InterfaceShop
{
public String getShoeName();
public String getShoeType();
public int getShoeValue();
}
接口实现:
package org.yjY.ocp.interfaceOcp.impl;
import org.yjY.ocp.interfaceOcp.InterfaceShop;
public class MenShoe implements InterfaceShop
{
private String shoeName;
private String shoeType;
private int shoeValue;
public MenShoe(String shoeName,String shoeType,int shoeValue)
{
this.shoeName = shoeName;
this.shoeType = shoeType;
this.shoeValue = shoeValue;
}
@Override
public String getShoeName()
{
return shoeName;
}
@Override
public String getShoeType()
{
return shoeType;
}
@Override
public int getShoeValue()
{
return shoeValue;
}
}
package org.yjY.ocp.interfaceOcp.impl;
import org.yjY.ocp.interfaceOcp.InterfaceShop;
public class WomenShoe implements InterfaceShop
{
private String shoeName;
private String shoeType;
private int shoeValue;
public WomenShoe(String shoeName,String shoeType,int shoeValue)
{
this.shoeName = shoeName;
this.shoeType = shoeType;
this.shoeValue = shoeValue;
}
@Override
public String getShoeName()
{
return shoeName;
}
@Override
public String getShoeType()
{
return shoeType;
}
@Override
public int getShoeValue()
{
return shoeValue;
}
}
扩展行为:
*男鞋原价大于200元打8折,原价大于150元打8.5折,其他价格一律9折;
*女鞋原价大于200元打7.5折,原价大于150元打8折,其他价格一律8.5折;
实现方案:
一、在接口中增加打折方法用于处理降价,此时两个实现该接口的类(MenShoe , WomenShoe )都必须修改,不符合开闭原则
二、在两个类(MenShoe , WomenShoe )中各增加一个方法,此方案好一些,但不是做好方案
三、增加两个类(MenShoeDiscount , WomenShoeDiscount ),分别用于处理男鞋和女鞋的降价,此方案修改量小,可扩展性强,最符合开闭原则。
package org.yjY.ocp.interfaceOcp.impl;
public class MenShoeDiscount extends MenShoe
{
public MenShoeDiscount(String shoeName, String shoeType, int shoeValue)
{
super(shoeName, shoeType, shoeValue);
}
public int getShoeValue()
{
int shoePrice = super.getShoeValue();
int discount = 0;
if (shoePrice>200)
{
discount = shoePrice*80/100;
}
if (shoePrice>150)
{
discount = shoePrice*85/100;
}
else
{
discount = shoePrice*90/100;
}
return discount;
}
}
package org.yjY.ocp.interfaceOcp.impl;
public class WomenShoeDiscount extends MenShoe
{
public WomenShoeDiscount(String shoeName, String shoeType, int shoeValue)
{
super(shoeName, shoeType, shoeValue);
}
public int getShoeValue()
{
int shoePrice = super.getShoeValue();
int discount = 0;
if (shoePrice>200)
{
discount = shoePrice*75/100;
}
if (shoePrice>150)
{
discount = shoePrice*80/100;
}
else
{
discount = shoePrice*85/100;
}
return discount;
}
}
测试JSP:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" import="org.yjY.ocp.interfaceOcp.impl.*"%>
<html>
<head>
</head>
<body>
<%
MenShoeDiscount msd = new MenShoeDiscount("男鞋名","男鞋类型",160);
out.println("鞋子价格:"+msd.getShoeValue());
%>
</body>
</html>
相关推荐
开闭原则(Open-Closed Principle,OCP)是软件工程中的一个基本原则,由Bertrand Meyer在1988年提出,它是面向对象设计的核心之一。这个原则规定了软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这...
1. **设计原则**:遵循SOLID原则(单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则),这有助于创建稳定、可复用的API。此外,还包括DRY(Don't Repeat Yourself)原则,避免重复代码。 2. **...
9. **设计原则**:遵循SOLID原则(单一职责、开闭、里氏替换、接口隔离和依赖倒置),可以使代码更易于理解和维护。 10. **性能优化**:可能涉及到数据库查询优化、缓存策略(如Redis)、负载均衡等手段,提升系统...
- 实现开闭原则的关键在于合理地抽象出系统的核心概念和行为。 #### 原则4:单一职责原则 **定义与理解:** 单一职责原则要求一个类只负责一项职责。如果一个类承担了过多的职责,则修改其中一个职责可能会对其他...
- 遵循SOLID原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。 - 使用设计模式:根据需要采用工厂模式、单例模式、观察者模式等常见设计模式,提高代码复用性和可扩展性。 - 代码结构:...
2. **面向对象设计原则**:书中可能强调SOLID原则,即单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP)。这些原则指导开发者创建可维护、可扩展的代码。 3. ...
12. **设计原则与模式**:遵循单一职责、开闭原则等设计原则,以及工厂模式、观察者模式等设计模式,能够提高代码的可读性和可维护性。 13. **日志记录**:通过Log4j或SLF4J等日志框架记录程序运行状态,便于问题...
开发者在编写过程中,应注意良好的编程习惯,如注释清晰、命名规范,同时遵循面向对象的设计原则,如单一职责、开闭原则等。在实际运行中,应进行单元测试和集成测试,确保各个模块功能正常,系统整体稳定可靠。 这...
在进行Java毕业设计时,学生还需要了解和遵循软件开发的最佳实践,比如编写清晰的文档,使用合适的命名规范,编写单元测试,以及遵循SOLID原则(单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则...
而“java设计类”则暗示了在实现过程中可能运用到面向对象设计原则,如单一职责原则、开闭原则、依赖倒置原则等,以及设计模式,如工厂模式、单例模式、策略模式等,来保证代码的可维护性和可扩展性。 在【压缩包子...
标签"JAVA2设计"提示我们,书中的内容可能还涉及软件设计原则,如SOLID原则(单一职责、开闭、里氏替换、接口隔离和依赖倒置),以及如何设计出可扩展、可维护的代码结构。书中可能包含对MVC(模型-视图-控制器)...
学习Java并不仅仅是记住语法,更重要的是理解和实践面向对象的设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。同时,通过实际项目和练习,将理论知识转化为实践经验,是成为熟练...
学习Java还需要掌握面向对象的设计原则,如单一职责、开闭原则、里氏替换、依赖倒置和接口隔离等。此外,Java SE(标准版)和Java EE(企业版)是两个主要的Java开发平台,其中Java EE提供了用于构建企业级应用的...
关于Java体系结构,我们将探讨软件设计的基本原则,如单一职责、开闭原则等,以及常见设计模式如工厂模式、观察者模式、策略模式等。此外,分层架构(如表现层、业务逻辑层、数据访问层)的构建也是重要部分。 最后...
首先介绍了设计模式的六大原则,包括单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则和迪米特法则。随后,将这些原则应用到实际场景中,并分析了在Spring和MyBatis框架中使用到的设计模式,以及...
- 设计上,推荐遵循面向对象的原则,如单一职责原则、开闭原则等,确保代码的可扩展性和可维护性。 - 常用类的使用应遵循Java库的标准,避免重复造轮子,提高代码复用。 - 日志规范要求清晰记录程序运行过程中的...
14. **设计原则与模式**:遵循单一职责原则、开闭原则、依赖倒置等设计原则,以及工厂模式、观察者模式等设计模式,能够写出更可读、可维护的代码。 通过深入学习和实践这些知识点,你可以掌握Java信息系统设计与...
- 学习设计模式的基本原则和分类,如单一职责、开闭原则等。 - 熟悉常见的设计模式,如工厂模式、适配器模式、装饰器模式等,并能在实际编程中应用。 9. **开发工具**: - 使用IDE,如Eclipse或IntelliJ IDEA,...
在这个项目中,我们需要了解类的设计原则,如单一职责原则(SRP)、开闭原则(OCP)等,以及如何使用继承和多态性来增强代码的可扩展性和灵活性。 2. **MVC设计模式**:Model-View-Controller(MVC)设计模式是开发...
其次,深入学习Java,你需要理解面向对象设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。这些原则有助于编写可维护、可扩展的代码。此外,深入研究集合框架(List、Set、Map接口...