OO设计原则

浅谈OO设计原理,以下原理及Demo提取自HeadFirst设计模式一书

1、将应用需要变化与不需要变化的代码分离, 将会变化的部分进行封装,使其他部分不会受到影响;

  Demo 中的Duck的Fly与Quack就是需要变化的行为,故将其提取出来,作为接口实现,并且在基类Duck中采用多态的方式来实例化接口。
2、针对接口编程,而不是针对实现编程;

  多态
3、多用接口,少用继承

      使系统有更大的弹性,不仅可以将算法封装成类,更可以在运行时动态更改行为,如:Duck中的setFlyBehavior和setQuackBehavior方法;
4、松耦合:降低对象之间的相互依赖; 

5、对扩展开发,对修改关闭;
     通过采用扩展的方式来达到免于修改的目的

 容易产生变化的两个行为接口:

 

Code

 

实现接口的行为类:

 

Code

 

 

基类:

using  System;
using  System.Collections.Generic;
using  System.Text;

using  HeadFristDesignPatterns.Domain.Interface;
using  HeadFristDesignPatterns.Domain.IFlyBehaviorExtend;
using  HeadFristDesignPatterns.Domain.IQuackBeahaviorExtend;

namespace  HeadFristDesignPatterns.Domain.Ducks
{
    
///   <summary>
    
///  基类设计思想:将易变的行为通过接口定义及实现,将不易变的行为保留实现,方便扩展,
    
///  针对接口编程的思想便由此而来
    
///   </summary>
     public   abstract   class  Duck
    {
        
public  IFlyBehavior flyBehavior;
        
public  IQuackBeahavior quackBehavior;

        
public  Duck()
        { }


        
///   <summary>
        
///  方便在子类中调用这两个设定方法来灵活这设定行为,而不是在构造方法中实例化
        
///   </summary>
        
///   <param name="fb"></param>
         public   void  setFlyBehavior(IFlyBehavior fb)
        {
            flyBehavior 
=  fb;
        }
        
public   void  setQuackBehavior(IQuackBeahavior qb)
        {
            quackBehavior 
=  qb;
        }

        
public   void  performFly()
        {
            flyBehavior.fly();
        }

        
public   void  performQuack()
        {
            quackBehavior.quack();
        }

        
public   void  swim()
        {
            Console.WriteLine(
" All ducks float , even decoys " );
        }

        
public   abstract   void  display();
    }
}
继承自Duck基类的子类在构造方法中选择正确的行为来实例化接口:
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

using  HeadFristDesignPatterns.Domain.Interface;
using  HeadFristDesignPatterns.Domain.IFlyBehaviorExtend;
using  HeadFristDesignPatterns.Domain.IQuackBeahaviorExtend;

namespace  HeadFristDesignPatterns.Domain.Ducks
{
    
public   class  MallardDuck:Duck
    {
        
public  MallardDuck()
        {
            flyBehavior 
=   new  FlyWithWings();
            quackBehavior 
=   new  Quack();
        }

        
public   override   void  display()
        {
            Console.WriteLine(
" I'm a real mallard duck !! " );
        }
    }
}

你可能感兴趣的:(设计原则)