您的位置:首页 > 其它

设计模式之Strategy(策略模式)

2010-01-20 14:42 465 查看
此模式应用到的原则:

1、找出应用可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码写在一起。

2、针对接口编程,而非针对实现编程

3、多用组合,少用继承。

策略模式定义:

定义算法族,分别封装起来。让它们之间可以互相替换,此模式让算法的变化独立与使用此算法的客户




下面直接把书中的代码弄上来

代码:

1、首先定义抽象鸭子类(超类)

/// <summary>
    /// 鸭子抽象类
    /// </summary>
    public abstract class Duck
    {
        FlyBehavior flyBehavior;//飞行接口
        QuackBehavior quackBehavior;//叫的接口
        /// <summary>
        /// 构造器
        /// </summary>
        public Duck()
        {
        }
        /// <summary>
        /// 动态设置如何飞行
        /// </summary>
        /// <param name="fb"></param>
        public void setFlyBehavior(FlyBehavior fb)
        {
            flyBehavior = fb;
        }
        /// <summary>
        /// 动态设置如何叫
        /// </summary>
        /// <param name="qb"></param>
        public void setQuackBehavior(QuackBehavior qb)
        {
            quackBehavior = qb;
        }
        /// <summary>
        /// 抽象方法---显示(供子类自定义)
        /// </summary>
        abstract void display();
        /// <summary>
        /// 调用实际飞行
        /// </summary>
        public void performFly()
        {
            flyBehavior.fly();
        }
        /// <summary>
        /// 调用实际叫法
        /// </summary>
        public void performQuack()
        {
            quackBehavior.quack();
        }
        /// <summary>
        /// 游泳方法(公用)
        /// </summary>
        public void swim() {
		Console.WriteLine("All ducks float, even decoys!");
	}
    }



2、飞行接口+各种方法类

/// <summary>
    /// 飞行接口
    /// </summary>
    public interface FlyBehavior
    {
        public void fly();
    }
    /// <summary>
    /// 不会飞行
    /// </summary>
    public class FlyNoWay : FlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("I can't fly");
        }
    }
    /// <summary>
    /// 载着火箭飞
    /// </summary>
    public class FlyRocketPowered : FlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("I'm flying with a rocket");
        }
    }
    /// <summary>
    ///翅膀飞
    /// </summary>
    public class FlyWithWings : FlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("I'm flying!!");
        }
    }





3、鸭子的叫法接口+实际叫法

/// <summary>
    /// 叫的接口
    /// </summary>
    public interface QuackBehavior
    {
        void quack();
    }
    /// <summary>
    /// 呱呱叫
    /// </summary>
    public class Quack : QuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("Quack");
        }
    }
    /// <summary>
    /// 吱吱叫
    /// </summary>
    public class Squeak : QuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("Squeak");
        }
    }
    /// <summary>
    /// 不会叫
    /// </summary>
    public class MuteQuack : QuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("<< Silence >>");
        }
    }



4、各种鸭子类

/// <summary>
    /// 玩具鸭
    /// </summary>
    public class DecoyDuck : Duck
    {
        public DecoyDuck()
        {
            setFlyBehavior(new FlyNoWay());
            setQuackBehavior(new MuteQuack());
        }
        public void display()
        {
            Console.WriteLine("I'm a duck Decoy");
        }
    }
    /// <summary>
    /// 
    /// </summary>
    public class MallardDuck : Duck
    {
        public MallardDuck()
        {
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();

        }
        public void display()
        {
            Console.WriteLine("I'm a real Mallard duck");
        }
    }
    /// <summary>
    /// 
    /// </summary>
    public class ModelDuck : Duck
    {
        public ModelDuck()
        {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Quack();
        }
        public void display()
        {
            Console.WriteLine("I'm a model duck");
        }
    }
    /// <summary>
    /// 
    /// </summary>
    public class RubberDuck : Duck
    {
        public RubberDuck()
        {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Squeak();
        }
        public void display()
        {
            Console.WriteLine("I'm a rubber duckie");
        }
    }







5、测试类

/// <summary>
    /// 测试类
    /// </summary>
    public class MiniDuckSimulator
    {
        public static void main(String[] args)
        {
            MallardDuck mallard = new MallardDuck();
            RubberDuck rubberDuckie = new RubberDuck();
            DecoyDuck decoy = new DecoyDuck();
            ModelDuck model = new ModelDuck();
            mallard.performQuack();
            rubberDuckie.performQuack();
            decoy.performQuack();
            model.performFly();
            model.setFlyBehavior(new FlyRocketPowered());
            model.performFly();
        }
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: