您的位置:首页 > 软件设计 > 面向对象 > 正文

面向对象设计中的开放封闭原则

更多 时间:2013-8-13 类别:软件设计 浏览量:1334

面向对象设计中的开放封闭原则

面向对象设计中的开放封闭原则

开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设 计原则,很多时候是为实现这一目标服务的。


一、开发封闭原则,其核心的思想是:


软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。


 

二、开放封闭原则主要体现在两个方面:


对扩展开放:意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭:意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。


实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展 方法,所以对于扩展就是开放的。这是实施开放封闭原则的基本思路,同时这种机制是建立在两个基本的设计原则的基础上,这就是Liskov替换原则和合成/聚合复用原则。关于这两个原则。

 


三:为什么要用到开放封闭原则?

我们在做任何系统的时候,都不要指望系统一开始就需求确定,这是不现实也是不科学的想法,既然需求一定是会变化的,那么我们如何在面对需求变化时,设计的网站或软件可以保持相对容易修改,保持相对稳定,不至于新的需求到来,整个推倒重做。只要保持开放封闭原则就可以做到

面对新需求的到来,要完成新的需求,对程序的改动是通过新增加代码完成的,不是通过修改现有代码完成的

 

四:开放封闭原则的两个问题?


开放封闭原则是说,你设计软件或网站的时候,时刻要把需求的变化考虑全面了,尽量的让这个类足够好,写好了就不去修改它,如果新的需求来了,增加一些类来完成新的需求,原来的代码能不动则不动。
 

 

五:开放封闭原则中的两个问题的解决办法

在我们最开始写程序的时候,假设需求变化不会发生,但当发生需求变化时,我们就立即(当发生小变化时,就及早的去想办法应对发生大变化的可能)构造抽象来隔离以后发生的同类变化,不能等到开发工作进行到一半了或很久了,在考虑抽象,考虑分离,那时候就很困难了

   

六:开放封闭原则的好处

遵循这个原则可以带来面向对象技术中声称的可维护,可扩展,可复用,灵活性好这些好处

   

七:开放封闭原则的注意事项

不要对应用程序中的每个部分都刻意的进行抽象,应该对应用程序中出现频繁变化的那部分构造抽象。

   

八、以银行业务员为例

    

  • C# 代码   复制
  • 
    //首先声明一个业务处理接口
    
    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();
     
            }
    
        }
    
    //这样当业务变更时,只需要修改对应的业务实现类就可以,其他不相干的业务就不必修改。当业务增加,只需要增加业务的实现就可以了。
    			

     

  •  

    您可能感兴趣