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

C# Design Patterns (2) - Strategy

 2009-06-22 08:33:04 来源:WEB开发网   
核心提示: 结行结果:算法A实现算法B实现算法C实现*/上方的「Shell (壳)」示例中,最下方的 Context 类,C# Design Patterns (2) - Strategy(3),为一种维护上下文信息的类,让 Strategy 类 (或 IStrategy 接口) 及其子类对象的算法,

结行结果:

算法A实现

算法B实现

算法C实现

*/

上方的「Shell (壳)」示例中,最下方的 Context 类,为一种维护上下文信息的类,让 Strategy 类 (或 IStrategy 接口) 及其子类对象的算法,能运行在这个上下文里。

下方的图 2 及其代码,为此 Shell 示例和 Strategy Pattern 的一个具体实现示例。我们知道,Linux 和 Windows 操作系统,在文本文件的「换行符」是不同的,前者为「n」,后者为「rn」。若我们要设计一个文本编辑工具,或简易的编程工具,必须要能随时转换这两种不同操作系统的换行符 (假设 .NET 已可执行于 Linux 上)。此时我们即不该在客户程序 (如:ASP.NET 页面的 Code-Behind) 中用硬编码 switch...case 的 hard coding 寫法,而应如下方示例,以 Strategy Pattern 实现此一功能,并将这些算法 (策略) 各自封装在各个子类中 (如 ASP.NET 项目的 App_Code 文件夹中的类,或其他类库项目中的类),使他们易于组合、更换,便于日后的维护和修改。

C# Design Patterns (2) - Strategy

图片看不清楚?请点击这里查看原图(大图)。

图 2 示例 02_Strategy.aspx.cs 的 Class Diagram。此为 Sybase PowerDesigner 的「Reverse Engineer」功能,所自动产生的图

02_Strategy.aspx.cs
using System;
using com.cnblogs.WizardWu.sample02;

//客户程序
public partial class _02_Strategy : System.Web.UI.Page
{
    String strLinuxText = "操作系统 n 红帽 Linux  创建的 n 文本文件";
    String strWindowsText = "操作系统 rn 微软 Windows 创建的 rn 文本文件";

    protected void Page_Load(object sender, EventArgs e)
    {        
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        switch(DropDownList1.SelectedValue)
        {
            case "Linux":
                Label1.Text = ContextCharChange.contextInterface(new LinuxStrategy(strWindowsText));
                //Label1.Text = strWindowsText.Replace("rn", "n");   //未用任何 Pattern 的写法
                break;
            case "Windows":
                Label1.Text = ContextCharChange.contextInterface(new WindowsStrategy(strLinuxText));
                //Label1.Text = strLinuxText.Replace("n", "rn");   //未用任何 Pattern 的写法
                break;
            default:
                Label1.Text = String.Empty;
                break;
        }
    }
}

namespace com.cnblogs.WizardWu.sample02
{
    //抽象算法类 (亦可用接口)。定义了所有策略的公共接口
    public abstract class TextStrategy
    {
        protected String text;

        public TextStrategy(String text)           //构造函数
        {
            this.text = text;
        }

        //算法需要完成的功能
        public abstract String replaceChar();
    }

    //具体算法类A
    public class LinuxStrategy : TextStrategy
    {
        public LinuxStrategy(String text)          //构造函数
            : base(text)
        {
        }

        //算法A实现方法
        public override String replaceChar()
        {
            text = text.Replace("rn", "n");
            return text;
        }
    }

    //具体算法类B
    public class WindowsStrategy : TextStrategy
    {
        public WindowsStrategy(String text)     //构造函数
            : base(text)
        {
        }

        //算法B实现方法
        public override String replaceChar()
        {
            text = text.Replace("n", "rn");
            return text;
        }
    }

    //执行对象。需要采用可替换策略执行的对象
    public class ContextCharChange
    {
        //执行对象依赖于策略对象的操作方法
        public static String contextInterface(TextStrategy strategy)
        {
            return strategy.replaceChar();
        }
    }

} // end of namespace

上一页  1 2 3 4  下一页

Tags:Design Patterns Strategy

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