WEB开发网
开发学院软件开发C语言 C# Design Patterns (2) - Strategy 阅读

C# Design Patterns (2) - Strategy

 2009-06-22 08:33:04 来源:WEB开发网   
核心提示: 图 3示例 02_Strategy.aspx.cs 的执行结果若未用任何 Pattern 的客户程序,可能就如下方的硬编码,C# Design Patterns (2) - Strategy(4),将「换行符」和算法,直接写死在 ASP.NET 的 Code-Behind 里,如本帖示例中

C# Design Patterns (2) - Strategy

图 3 示例 02_Strategy.aspx.cs 的执行结果

若未用任何 Pattern 的客户程序,可能就如下方的硬编码,将「换行符」和算法,直接写死在 ASP.NET 的 Code-Behind 里,导至事后的维护和扩展不易。 

hard coding
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    switch(DropDownList1.SelectedValue)
    {
        case "Linux":
            Label1.Text = strWindowsText.Replace("rn", "n");
            break;
        case "Windows":
            Label1.Text = strLinuxText.Replace("n", "rn");
            break;
        default:
            Label1.Text = String.Empty;
            break;
    }
}

此外,若用 Simple Factory Pattern (简单工厂模式) 虽然也能解决上述硬编码的问题,但就如我们前一篇帖子「C# Design Patterns (1) - Factory Method」曾经提过的缺点,日后若要添加或修改功能时,仍要修改、重新编译 server-side 的「工厂类」。所以在此种情况下,用 Strategy 会是比 Simple Factory 更好的选择。

--------------------------------------------------------

Strategy Pattern 的优点:

简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独做测试。

避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。

高内聚、低偶合。

Strategy Pattern 的缺点:

因为每个具体策略都会产生一个新类,所以会增加需要维护的类的数量。

选择所用具体实现的职责由客户程序承担,并转给 Context 对象,并没有解除客户端需要选择判断的压力。

若要减轻客户端压力,或程序有特殊考量,还可把 Strategy 与 Simple Factory 两种 Pattern 结合,即可将选择具体算法的职责改由 Context 来承担,亦即将具体的算法,和客户程序做出隔离。有关这方面的概念和示例,可参考伍迷的「大话设计模式」一书 [10]。

--------------------------------------------------------

此外,从行为上来看,State Pattern 和 Strategy Pattern 有点类似,但前者可看作后者的动态版本。

State:看当前是什么状态,就采取什么动作。

Strategy:看需求及情景为何,采用适当的策略。

State 中,当对象内部的状态改变时,它可切换到一组不同的操作,从而改变对象的行为,例如 GoF 示例中的 TCP 连接;而 Strategy 是直接采用适当的策略 (算法),如本帖示例中,不同的操作系统,实现换行的具体算法类 LinuxStrategy 与 WindowsStrategy。

上一页  1 2 3 4 

Tags:Design Patterns Strategy

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接