OO原則:
1.封裝變化
2.多用組合,少用繼承
3.針對接口編程,不針對實現
OO模式:
策略模式(Strategy Pattern),定義算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶
類結構圖:
定義Duck虛基類:
/// <summary>
/// 定義Douck虛基類
/// 將不會變化的部份定義在此
/// 將會變化的部份(不同鴨子飛行為,叫行為等)通過相應接口調用
/// </summary>
public abstract class Duck
{
//定義飛行為接口
protected IFlyBehavior flyBehavior;
//定義叫行為接口
protected IQuackBehavior quackBehavior;
//所有鴨子都會設定顯示,定義為虛方法交由具體鴨子類實現其顯示
public abstract string Display();
//所有鴨子都會游泳
public string Swim()
{
return "Swim";
}
//Duck對象只要調用flyBehavior.Fly()對象飛便可
//無需知道其具體實現,具體實現由具體鴨子類指定
public string PerformFly()
{
return flyBehavior.Fly();
}
//Duck對象只要調用quackBehavior.Quack()對象叫便可
//無需知道其具體實現,具體實現由具體鴨子類型指定
public string PerformQuack()
{
return quackBehavior.Quack();
}
//可動態設置飛行為
public void SetPerformFly(IFlyBehavior fb)
{
flyBehavior = fb;
}
//可動態設置叫行為
public void SetPerformQuack(IQuackBehavior qb)
{
quackBehavior = qb;
}
}
定義飛,叫行為接口:
/// <summary>
/// 飛行為接口,所有飛行為必須實現該接口
/// </summary>
public interface IFlyBehavior
{
string Fly();
}
/// <summary>
/// 叫行為接口,所有叫行為必須實現該接口
/// </summary>
public interface IQuackBehavior
{
string Quack();
}
定義實現飛行,叫行為的具體實現類:
/// <summary>
/// 飛行行為具體實現,繼承IFlyBehavior接口
/// </summary>
public class FlyWithWings : IFlyBehavior
{
public string Fly()
{
return "FlyWithWings";
}
}
/// <summary>
/// 飛行行為具體實現,繼承IFlyBehavior接口
/// </summary>
public class FlyNoWay : IFlyBehavior
{
public string Fly()
{
return "FlyNoWay";
}
}
/// <summary>
/// 叫行為具體實現,繼承IQuackBehavior接口
/// </summary>
public class GaQuack : IQuackBehavior
{
public string Quack()
{
return "GAGAGA!";
}
}
/// <summary>
/// 叫行為具體實現,繼承IQuackBehavior接口
/// </summary>
public class ZiQuack : IQuackBehavior
{
public string Quack()
{
return "ZIZIZI!";
}
}
定義具體的鴨子類型(繼承Duck虛基類):
/// <summary>
/// 定義綠頭鴨類
/// </summary>
public class MallardDuck : Duck
{
//構造函數
public MallardDuck()
{
this.flyBehavior = new FlyWithWings();
this.quackBehavior = new GaQuack();
}
//重寫實現自己的方法
public override string Display()
{
return "MallardDuck";
}
}
/// <summary>
/// 定義模型鴨類
/// </summary>
public class ModelDuck : Duck
{
//構造函數
public ModelDuck()
{
this.flyBehavior = new FlyWithWings();
this.quackBehavior = new GaQuack();
}
//重寫實現自己的方法
public override string Display()
{
return "ModelDuck";
}
}
調用:
//定義綠頭鴨實例
MallardDuck mallardDuck = new MallardDuck();
//定義模型鴨實例
ModelDuck modelDuck = new ModelDuck();
//重新指定飛行為
modelDuck.SetPerformFly(new FlyNoWay());
//重新指定叫行為
modelDuck.SetPerformQuack(new ZiQuack());
Response.Write(mallardDuck.Display() + ":" + mallardDuck.PerformFly() + ","
+ mallardDuck.PerformQuack() + "<br/>");
Response.Write(modelDuck.Display() + ":" + modelDuck.PerformFly() + ","
+ modelDuck.PerformQuack());