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());