`

面向对象设计原则之二:开放封闭原则

 
阅读更多
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接口。

拒绝滥用抽象,只将经常变化的部分进行抽象。

分享到:
评论

相关推荐

    面向对象设计原则.ppt

    2. **开放封闭原则(OCP)**:软件实体(类、模块、函数等)应该是对扩展开放,对修改关闭。当需求变更时,应尽可能通过扩展已有代码,而不是修改原有代码来达到目的。在上述例子中,新类型的员工可以通过增加新的类...

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则

    2. 开放封闭原则(OCP):软件实体(类、模块、函数等)应对扩展开放,对修改关闭。这意味着我们可以添加新的功能而不必修改现有代码。 3. 里氏替换原则(LSP):子类型必须能够替换其基类型,而不影响程序的正确性...

    面向对象设计原则英文文章

    首先,我们来了解四个基础的面向对象设计原则:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)和接口隔离原则(ISP)。 1. 单一职责原则(Single Responsibility Principle, SRP):一个类或模块...

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则.zip

    1. **设计原则**:面向对象设计模式的基础,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP)。这些原则指导我们编写可维护、可扩展的代码。 2. **常见设计模式*...

    面向对象设计原则.pdf

    **开放封闭原则 (OCP, Open/Closed Principle)** - **定义**: 软件实体应该是对扩展开放的,但对修改封闭。 - **目的**: 使系统能够适应需求的变化,同时无需修改现有代码。 - **实践建议**: - 使用接口或抽象类...

    UML简介与面向对象的设计原则

    2. **开放封闭原则(OCP)**:软件实体(类、模块、函数等)应该是可扩展的,但对修改应封闭。这意味着新增功能时,不应修改已有的代码。 3. **里氏替换原则(LSP)**:子类型必须能够替换它们的基类型,而不影响...

    C++设计模式课件2_面向对象设计原则.pdf

    2. **开放封闭原则(Open/Closed Principle, OCP)** - **原则阐述**:软件实体应该是可扩展的,但不应该可修改。 - **实践意义**:确保现有代码的稳定性,同时允许新的功能或行为的加入,这有助于保持软件系统的...

    java面向对象设计的六大原则

    以下将详细介绍面向对象设计的六大原则:单一职责原则(Single Responsibility Principle, SRP)、开放封闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、依赖倒置原则...

    面向对象设计原则解析

    2. **开放封闭原则(Open-Closed Principle, OCP)** 一个类应该是对扩展开放,对修改封闭。这意味着当需求变化时,我们应当尽可能通过扩展已有代码来实现,而不是修改原有的代码。这有利于保持代码的可维护性。 3...

    面向对象的设计原则.pdf

    本文将详细介绍以下四个主要的面向对象设计原则: 1. 开放封闭原则(OCP):这个原则由贝里·伯特兰提出,它主张软件实体(如类、模块、函数等)应该是对扩展开放的,但是对修改封闭的。也就是说,在不改变现有代码...

    面向对象设计原则和设计模式的概念

    面向对象设计原则与设计模式是软件工程领域的重要组成部分,它们为构建高质量、可维护和可扩展的软件系统提供了指导方针。下面将详细阐述面向对象设计原则及其如何促进软件的复用,以及设计模式的概念。 ### 面向...

    面向对象设计原则

    面向对象设计原则是软件开发中的一种重要指导思想,它们旨在提高代码的灵活性、可维护性和可扩展性。这些原则是经过长期实践总结出的最佳实践,适用于各种面向对象编程语言。以下将详细介绍其中的一些核心原则: 1....

    23种 设计模式---面向对象的基本原则

    2. 开放封闭原则(Open-Closed Principle, OCP):软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭。即在不修改原有代码的基础上,通过增加新的代码来扩展功能。 3. 里氏替换原则(Liskov Substitution ...

    面向对象的设计原则详解

    面向对象设计原则是软件开发中的核心指导思想,它们旨在提高代码的可维护性、可扩展性和可重用性。在面向对象设计(OOD)中,遵循这些原则可以帮助我们构建更加稳定、灵活的系统。以下是对这些原则的详细解释: 1. ...

    UML面向对象建模与设计答案

    10. **面向对象设计原则**:包括单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)等,这些都是使用UML进行设计时应遵循的指导原则。 在学习过程中,通过...

    面向对象设计原则:突破软件工程学习的质的飞跃

    ### 面向对象设计原则:突破软件工程学习的质的飞跃 在软件工程领域,面向对象设计(Object-Oriented Design, OOD)是一种重要的编程范式和技术,它不仅帮助开发者更好地组织代码,还提高了软件系统的可维护性和可...

    面向对象设计原则和设计模式

    2. **开放封闭原则(OCP)**:软件实体(类、模块、函数等)应对扩展开放,对修改关闭。这意味着在不修改原有代码的情况下,可以通过扩展增加新功能。 3. **里氏替换原则(LSP)**:子类型必须能够替换它们的基类型,而...

    面向对象设计原则_达内培训

    2. **OCP开放封闭原则**:开放封闭原则主张软件实体(如类、模块、函数)应该对扩展开放,对修改封闭。换句话说,我们可以通过增加新代码来增强现有功能,而无需修改原有的代码。这通常通过抽象和多态来实现,确保了...

    面向对象设计模式与原则

    这种设计体现了面向对象设计模式中的“开放封闭原则”。 #### 结论 面向对象设计模式是软件开发领域中非常重要的工具,它不仅有助于构建灵活、可扩展和易于维护的系统,还能促进团队之间的有效沟通。通过对GoF23种...

Global site tag (gtag.js) - Google Analytics