open-closed Principle
见此文,写的不错。尤其是那两个例子,一看就有点明白OCP了。
真正到设计时,要多想想这些变化。
开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。
如何做到对扩展开放,对修改封闭呢?
实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。
对于违反这一原则的类,必须通过重构来进行改善。常用于实现的设计模式主要有Template Method模式和Strategy 模式。而封装变化,是实现这一原则的重要手段,将经常变化的状态封装为一个类。
以银行业务员为例
没有实现OCP的设计:
public class BankProcess
{ //存款
public void Deposite(){}
//取款
public void Withdraw(){ }
//转账
public void Transfer(){}
}
public class BankStaff
{
private BankProcess bankpro = new BankProcess();
public void BankHandle(Client client)
{
switch (client.Type)
{ //存款
case "deposite":
bankpro.Deposite();
break;
//取款
case "withdraw":
bankpro.Withdraw();
break;
//转账
case "transfer":
bankpro.Transfer();
break;
}
}
}
这种设计显然是存在问题的,目前设计中就只有存款,取款和转账三个功能,将来如果业务增加了,比如增加申购基金功能,理财功能等,就必须要修改BankProcess业务类。我们分析上述设计就不能发现把不能业务封装在一个类里面,违反单一职责原则,而有新的需求发生,必须修改现有代码则违反了开放封闭原则。
从开放封闭的角度来分析,在银行系统中最可能扩展的就是业务功能的增加或变更。对业务流程应该作为扩展的部分来实现。当有新的功能时,不需要再对现有业务进行重新梳理,然后再对系统做大的修改。
如何才能实现耦合度和灵活性兼得呢?
那就是抽象,将业务功能抽象为接口,当业务员依赖于固定的抽象时,对修改就是封闭的,而通过继承和多态继承,从抽象体中扩展出新的实现,就是对扩展的开放。
以下是符合OCP的设计:
首先声明一个业务处理接口
public interface IBankProcess{ void Process();}
public class DepositProcess : IBankProcess
{
public void Process()
{ //办理存款业务
Console.WriteLine("Process Deposit");
}
}
public class WithDrawProcess : IBankProcess
{
public void Process()
{ //办理取款业务
Console.WriteLine("Process WithDraw");
}
}
public class TransferProcess : IBankProcess
{
public void Process()
{ //办理转账业务
Console.WriteLine("Process Transfer");
}
}
public class BankStaff
{
private IBankProcess bankpro = null;
public void BankHandle(Client client)
{
switch (client.Type)
{ //存款
case "Deposit":
userProc = new DepositUser();
break;
//转账
case "Transfer":
userProc = new TransferUser();
break;
//取款
case "WithDraw":
userProc = new WithDrawUser();
break;
}
userProc.Process();
}
}
这样当业务变更时,只需要修改对应的业务实现类就可以,其他不相干的业务就不必修改。当业务增加,只需要增加业务的实现就可以了。
设计建议:
开放封闭原则,是最为重要的设计原则,Liskov替换原则和合成/聚合复用原则为开放封闭原则提供保证。
可以通过Template Method模式和Strategy模式进行重构,实现对修改封闭,对扩展开放的设计思路。
封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态,一般将其封装为一个抽象,例如银行业务中IBankProcess接口。
拒绝滥用抽象,只将经常变化的部分进行抽象。
分享到:
相关推荐
2. **开放封闭原则(OCP)**:软件实体(类、模块、函数等)应该是对扩展开放,对修改关闭。当需求变更时,应尽可能通过扩展已有代码,而不是修改原有代码来达到目的。在上述例子中,新类型的员工可以通过增加新的类...
2. 开放封闭原则(OCP):软件实体(类、模块、函数等)应对扩展开放,对修改关闭。这意味着我们可以添加新的功能而不必修改现有代码。 3. 里氏替换原则(LSP):子类型必须能够替换其基类型,而不影响程序的正确性...
首先,我们来了解四个基础的面向对象设计原则:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)和接口隔离原则(ISP)。 1. 单一职责原则(Single Responsibility Principle, SRP):一个类或模块...
**开放封闭原则 (OCP, Open/Closed Principle)** - **定义**: 软件实体应该是对扩展开放的,但对修改封闭。 - **目的**: 使系统能够适应需求的变化,同时无需修改现有代码。 - **实践建议**: - 使用接口或抽象类...
2. **开放封闭原则(OCP)**:软件实体(类、模块、函数等)应该是可扩展的,但对修改应封闭。这意味着新增功能时,不应修改已有的代码。 3. **里氏替换原则(LSP)**:子类型必须能够替换它们的基类型,而不影响...
2. **开放封闭原则(Open/Closed Principle, OCP)** - **原则阐述**:软件实体应该是可扩展的,但不应该可修改。 - **实践意义**:确保现有代码的稳定性,同时允许新的功能或行为的加入,这有助于保持软件系统的...
以下将详细介绍面向对象设计的六大原则:单一职责原则(Single Responsibility Principle, SRP)、开放封闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、依赖倒置原则...
2. **开放封闭原则(Open-Closed Principle, OCP)** 一个类应该是对扩展开放,对修改封闭。这意味着当需求变化时,我们应当尽可能通过扩展已有代码来实现,而不是修改原有的代码。这有利于保持代码的可维护性。 3...
本文将详细介绍以下四个主要的面向对象设计原则: 1. 开放封闭原则(OCP):这个原则由贝里·伯特兰提出,它主张软件实体(如类、模块、函数等)应该是对扩展开放的,但是对修改封闭的。也就是说,在不改变现有代码...
面向对象设计原则与设计模式是软件工程领域的重要组成部分,它们为构建高质量、可维护和可扩展的软件系统提供了指导方针。下面将详细阐述面向对象设计原则及其如何促进软件的复用,以及设计模式的概念。 ### 面向...
C#作为一种流行的面向对象编程语言,在设计模式的实现上表现出色,而本书《C#面向对象设计模式纵横谈(1):面向对象设计模式与原则.zip》则深刻揭示了如何将这些模式与原则贯彻于C#代码之中。 首先,让我们从设计...
面向对象设计原则是软件开发中的一种重要指导思想,它们旨在提高代码的灵活性、可维护性和可扩展性。这些原则是经过长期实践总结出的最佳实践,适用于各种面向对象编程语言。以下将详细介绍其中的一些核心原则: 1....
2. 开放封闭原则(Open-Closed Principle, OCP):软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭。即在不修改原有代码的基础上,通过增加新的代码来扩展功能。 3. 里氏替换原则(Liskov Substitution ...
面向对象设计原则是软件开发中的核心指导思想,它们旨在提高代码的可维护性、可扩展性和可重用性。在面向对象设计(OOD)中,遵循这些原则可以帮助我们构建更加稳定、灵活的系统。以下是对这些原则的详细解释: 1. ...
10. **面向对象设计原则**:包括单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)等,这些都是使用UML进行设计时应遵循的指导原则。 在学习过程中,通过...
### 面向对象设计原则:突破软件工程学习的质的飞跃 在软件工程领域,面向对象设计(Object-Oriented Design, OOD)是一种重要的编程范式和技术,它不仅帮助开发者更好地组织代码,还提高了软件系统的可维护性和可...
2. **开放封闭原则(OCP)**:软件实体(类、模块、函数等)应对扩展开放,对修改关闭。这意味着在不修改原有代码的情况下,可以通过扩展增加新功能。 3. **里氏替换原则(LSP)**:子类型必须能够替换它们的基类型,而...
2. **OCP开放封闭原则**:开放封闭原则主张软件实体(如类、模块、函数)应该对扩展开放,对修改封闭。换句话说,我们可以通过增加新代码来增强现有功能,而无需修改原有的代码。这通常通过抽象和多态来实现,确保了...
这种设计体现了面向对象设计模式中的“开放封闭原则”。 #### 结论 面向对象设计模式是软件开发领域中非常重要的工具,它不仅有助于构建灵活、可扩展和易于维护的系统,还能促进团队之间的有效沟通。通过对GoF23种...