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