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 !!");
        }
    }
}
posted @ 2009-01-25 13:29  JerryShi  阅读(288)  评论(0编辑  收藏  举报