注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 一个黑客与一个电脑白痴的..
 帮助

学习设计模式之旅 / 策略模式 (Strategy)


2008-06-30 21:13:31
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://maddish.blog.51cto.com/282288/84802
Design Patterns - Strategy
策略模式(Strategy Pattern)属于对象行为型模式,体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。策略模式的定义如下:
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。每一个算法封装到具有共同接口的独立的类中,策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;
  策略模式中有三个对象:
(1)       环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)       抽象策略对象:它可由接口或抽象类来实现。
(3)       具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
我们先用一个简单的例子开始. 一个实现游戏中的更换武器的场景。游戏中的每个角色配对一个武器。当然武器是可以随便更换的。。其中定义了角色的抽象,武器的抽象接口。
Heroes(角色)抽象类 定义了 角色名称属性, 武器接口,更换武器的函数,一个虚方法为更换武器的过程。

    public abstract class Heroes
    {
        public string HeroesName;
        protected IWeaponBehavior weapon;
        public void setWeapon(IWeaponBehavior w) { this.weapon = w; }
        public virtual void Fight()
        {
            throw new Exception(" this method should be Rwritten");
        }
    }
    // 大法师
    public class ArchMage : Heroes
    {
        public ArchMage()
        {
            this.HeroesName = "法师";
        }
        public override void Fight()
        {
            Console.Write(this.HeroesName);
            this.weapon.useWeapoon();
        }
    }
 
通过以下步骤,开发人员可以很容易地在软件中实现策略模型:
 1.对策略对象定义一个公共接口。
 2.编写策略类,该类实现了上面的公共接口。
 3.在使用策略对象的类中保存一个对策略对象的引用。
该武器为公告接口,具体的共有4种不同的武器(策略类 实现了公共接口) 其中都实现了各自武器的绘画..
   
 
    // 武器接口
    public interface IWeaponBehavior
    {
        void useWeapoon();
    }
    // 实现用宝剑挥舞
    public class SwordBehavior : IWeaponBehavior
    {
        public void useWeapoon()
        {
            Console.Write(" 宝剑挥舞 ");
        }
    }
    // 实现匕首刺杀
    public class KnifeBehavior : IWeaponBehavior
    {
        public void useWeapoon()
        {
            Console.Write(" 匕首刺杀 ");
        }
    }
    // 实现用弓箭刺杀
    public class BowAndArrowBehavior : IWeaponBehavior
    {
        public void useWeapoon()
        {
            Console.Write(" 弓箭刺杀 ");

本文出自 “maddish” 博客,请务必保留此出处http://maddish.blog.51cto.com/282288/84802





    文章评论
 
2008-07-02 11:12:54
我最策略模式还是很感兴趣的 学习啦

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: