现在的位置: 首页 > 综合 > 正文

策略模式

2013年10月21日 ⁄ 综合 ⁄ 共 2343字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.