.NET乐园
一个梦想,一个行动…… (欢迎光临我的淘宝http://pipis.taobao.com,专营户外手电筒、头灯、营地灯、自行车灯)
动机:定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。

场景:设计一个自动投票程序,根据常用投票对象的计票策略不同,定义一系列不同自动投票策略,可根据投票对象策略选用适当的自动投票策略。


结构
Strategy模式结构图

代码

namespace DesignPattern.Strategy
{
    
public interface IVoteStrategy
    
{
        
void Vote();

        
// 统计投票情况
        void Stat();
    }


    
public class VoteStrategyA : IVoteStrategy
    
{
        
public void Vote()
        
{
        }

        
public void Stat()
        
{
        }

    }


    
public class VoteStrategyB : IVoteStrategy
    
{
        
public void Vote()
        
{
        }

        
public void Stat()
        
{
        }

    }


    
public class VoteStrategyC : IVoteStrategy
    
{
        
public void Vote()
        
{
        }

        
public void Stat()
        
{
        }

    }

}

namespace DesignPattern.Strategy
{
    
public class AutoVote
    
{
        
private IVoteStrategy strategy;

        
public AutoVote(IVoteStrategy strategy)
        
{
            
this.strategy = strategy;
        }


        
public IVoteStrategy Strategy
        
{
            
set
            
{
                
this.strategy = value;
            }

        }


        
public void Vote()
        
{
            
//
            strategy.Vote();
        }


        
public void Stat()
        
{
            
//
            strategy.Stat();
        }

    }

}


要点
        1、Strategy及其子类为组件提供了一系列可重用的算法,从而使得类型在运行时方便地根据需要在各个算法之间进行切换,所谓封装算法,支持算法的变化。
        2、本模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦。含有许多条件判断语句的代码通常都需要本模式。
        3、与State模式类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。
posted on 2007-08-24 00:25  Charly  阅读(562)  评论(1编辑  收藏  举报