OO设计原则

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

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

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

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

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

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

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

 

ContractedBlock.gif ExpandedBlockStart.gif Code
namespace HeadFristDesignPatterns.Domain.Interface
{
    
public interface IQuackBeahavior
    {
        
void quack();
    }

  
public interface IFlyBehavior
    {
        
void fly();
    }
}

 

实现接口的行为类:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using HeadFristDesignPatterns.Domain.Interface;

namespace HeadFristDesignPatterns.Domain.IFlyBehaviorExtend
{
    
public class FlyWithWings:IFlyBehavior
    {

        
#region IFlyBehavior Members

        
public void fly()
        {
            Console.WriteLine(
"I'm flying !!");
        }

        
#endregion
    }

  
public class FlyNoWay:IFlyBehavior
    {

        
#region IFlyBehavior Members

        
public void fly()
        {
            Console.WriteLine(
"I can't fly !!");
        }

        
#endregion
    }
}

 

 

基类:

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 !! " );
        }
    }
}

转载于:https://www.cnblogs.com/jerryshi/archive/2009/01/25/1380848.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值