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:

  • 相关阅读:
    我认知的javascript之函数调用
    table 的宽度设置无效
    【转】微信读书排版引擎自动化测试方案
    RocksDB原理及应用
    ElasticSearch 架构及应用简介
    芝加哥大学论文写作指南 简述
    python 常用模块
    Flask-SQLAlchemy安装及设置
    selenium设置程序失败后重启
    获取临时IP加入临时列表使用
  • 原文地址:https://www.cnblogs.com/LeoTang/p/2442832.html
Copyright © 2011-2022 走看看