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:

  • 相关阅读:
    AC日记——色板游戏 洛谷 P1558
    AC日记——方差 洛谷 P1471
    AC日记——[Scoi2010]序列操作 bzoj 1858
    AC日记——Sagheer and Nubian Market codeforces 812c
    AC日记——Sagheer, the Hausmeister codeforces 812b
    AC日记——Sagheer and Crossroads codeforces 812a
    [BJOI2019]排兵布阵 DP
    多重背包二进制优化
    BZOJ 3211 花神游历各国 线段树
    「CQOI2006」简单题 线段树
  • 原文地址:https://www.cnblogs.com/LeoTang/p/2442832.html
Copyright © 2011-2022 走看看