posts - 44, comments - 269, trackbacks - 22, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

一.Strategy Pattern(策略模式)

Posted on 2007-02-28 14:11 自適應軟件...... 阅读(1416) 评论(6)  编辑 收藏 所属分类: Design Pattern
其它模式:

   一.Strategy Pattern(策略模式)
   二.Template Method Pattern(模版方法模式)

   三.Bridge Pattern(橋接模式)
   四.Visitor Pattern(訪問者模式)


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Strategy Pattern.aspx.cs" Inherits="Pattern_Strategy_Pattern" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>Strategy Pattern</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
    
        
<asp:TextBox ID="tb_result" runat="server" TextMode="MultiLine" Rows="5"></asp:TextBox>
        
<asp:Button ID="bt_submit" runat="server" OnClick="bt_submit_Click"  Text="StrategyPattern" />    
        
<select id="strategy_select" runat="server">
            
<option value="A" selected="selected">A</option>
            
<option value="B">B</option>
            
<option value="C">C</option>
        
</select>
    
</div>
    
</form>
</body>
</html>

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// 策略模式,
/// 1.使用情況:1).讓一個對象動態的選擇多種行為.2)讓一個系統動態的選擇多種算法,而且算法使用數據和內容不讓客戶端知道.
/// 2.優點:1)恰當的使用了繼承,可以把行為類的很多公用代碼移到父類,這樣減少了代碼的重複性.
/// 3.缺點:1)各種行為需要共同的接口,因此,在用此模式前,要清楚所有的行為.
/// 4.比較:策略模式与很多其它的模式都有着广泛的联系。Strategy很容易和Bridge模式相混淆。虽然它们结构很相似,但它们却是为解决不同的问题而设计的。
/// Strategy模式注重于算法的封装,而Bridge模式注重于分离抽象和实现,为一个抽象体系提供不同的实现。Bridge模式与Strategy模式都很好的体现了"Favor composite over inheritance"的观点。
/// </summary>
public partial class Pattern_Strategy_Pattern : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {

    }

    
private void StrategyFactory()
    {
        Context ttt 
= null;
        
switch (strategy_select.Items[strategy_select.SelectedIndex].Value.ToString())
        {
                
            
case "A":
                ttt 
= new Context(new ConcreteStrategyA());
                tb_result.Text 
= ttt.ContextInterface(); 
                
break;
            
case "B":
                ttt 
= new Context(new ConcreteStrategyB());
                tb_result.Text 
= ttt.ContextInterface();
                
break;
            
case "C":
                ttt 
= new Context(new ConcreteStrategyC());
                tb_result.Text 
= ttt.ContextInterface();
                
break;
            
default:
                ttt 
= new Context(new ConcreteStrategyC());
                tb_result.Text 
= ttt.ContextInterface();
                
break;
        }
       
    }
    
protected void bt_submit_Click(object sender, EventArgs e)
    {
        StrategyFactory();
    }
}

abstract class Strategy
{
    
abstract public string AlgorithmInterface();
}

class ConcreteStrategyA : Strategy
{
    
public override string AlgorithmInterface()
    {
        
return "A";
    }
}
class ConcreteStrategyB : Strategy
{
    
public override string AlgorithmInterface()
    {
        
return "B";
    }
}
class ConcreteStrategyC : Strategy
{
    
public override string AlgorithmInterface()
    {
        
return "C";
    }
}
class Context
{
    Strategy strategy;
    
public Context(Strategy strategy)
    {
        
this.strategy = strategy;
    }
    
public string ContextInterface()
    {
        
return strategy.AlgorithmInterface();
    }
}



Feedback

#1楼    回复  引用  查看    

2007-02-28 14:43 by JesseZhao      
最好来点说明,只帖代码不怎么爽

#2楼 [楼主]   回复  引用  查看    

2007-02-28 14:49 by 自適應軟件......      
代碼中間有說明!

#3楼    回复  引用  查看    

2007-02-28 16:48 by NCindy      
个人感觉Strategy更容易和TemplateMethod混淆。

#4楼 [楼主]   回复  引用  查看    

2007-03-01 08:43 by 自適應軟件......      
TemplateMethod:更注重事先定義一系列流程節點(包括屬性和方法),然後,再具體的實現,就像一個模板,只需要按照模板實現就好了.當然,也可以在定義模版的時候就處理一些公用方法,避免代碼的重複.

Strategy:看起來結構是很像TemplateMethod,可能是我的例子沒有選好.我覺得它更注重節點(動作,算法)的獨立性,系統(代碼)可以動態的隨意的新增節點或者調用節點.

#5楼    回复  引用  查看    

2007-05-13 01:00 by suiqirui      
支持,

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-03-02 14:58 编辑过


相关链接: