zoukankan      html  css  js  c++  java
  • Strategy Pattern

    Definition:

    Identify the aspects of your application that vary and separate them from what stays the same

    Sample Code: 

    namespace StrategyPattern
    {
        public abstract class Duck
        {
            protected FlyBehavior flyBehavior;
            protected QuackBehavior quackBehavior;
    
            public Duck() { }
    
            public abstract void display();
    
            public void swim()
            {
                Console.WriteLine("All ducks float");
            }
            
            public void performFly() 
            {
                flyBehavior.fly();
            }
            public void performQuack()
            {
                quackBehavior.quack();
            }
            public void setFlyBehavior(FlyBehavior behavior)
            {
                flyBehavior = behavior;
            }
            public void setQuackBehavior(QuackBehavior behavior)
            {
                quackBehavior = behavior;
            }
        }
        public interface FlyBehavior
        {
            void fly();
        }
        public interface QuackBehavior
        {
            void quack();
        }
        public class FlyWithWings : FlyBehavior
        {
            public void fly()
            {
                Console.WriteLine("Fly with wings");
            }
        }
        public class FlyNoWay : FlyBehavior
        {
            public void fly()
            {
                Console.WriteLine("Do nothing"); 
            }
        }
        public class Quack : QuackBehavior
        {
            public void quack()
            {
                Console.WriteLine("Duck is quacking");
            }
        }
        public class Squeak : QuackBehavior
        {
            public void quack()
            {
                Console.WriteLine("Duck is squeaking");
            }
        }
        public class MuteQuack : QuackBehavior
        {
            public void quack()
            {
                Console.WriteLine("Do nothing");
            }
        }
    
        public class MallarDuck : Duck
        {
            public MallarDuck() 
            {
                flyBehavior = new FlyWithWings();
                quackBehavior = new Quack();
            }
            public override void display()
            {
                Console.WriteLine("This is a real Mallard duck");
            }
        }
    }

    Usage:

            static void CallStrategy()
            {
                MallarDuck duck = new MallarDuck();
    
                //Perform the default behaviors assigned in construct
                duck.performFly();
                duck.performQuack();
    
                //Change the hehaviors during runtime
                duck.setFlyBehavior(new FlyNoWay());
                duck.setQuackBehavior(new MuteQuack());
    
                duck.performFly();
                duck.performQuack();
            }

    Class Diagram:

  • 相关阅读:
    [bzoj1568]李超线段树模板题(标志永久化)
    [tyvj1860]后缀数组
    [poj3264]rmq算法学习(ST表)
    LintCode-82.落单的数
    LintCode-53.翻转字符串
    LintCode-56.两数之和
    LintCode-379.将数组重新排序以构造最小值
    LintCode-5.第k大元素
    LintCode-3.统计数字
    LintCode-4.丑数 II
  • 原文地址:https://www.cnblogs.com/LeoTang/p/2442832.html
Copyright © 2011-2022 走看看