策略模式(Strategy Pattern):定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则

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

2.针对接口编辑,而不是针对实现编程。

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

UML类图

代码:

/// <summary>
    /// abstract base class of Ducks
    /// </summary>
    public abstract class Duck
    {
        protected IFlyBehavior flyBehavior;
        protected IQuackBehavior quackBehavior;
       
        public IQuackBehavior QuackBehavior
        {
            get
            {
                return quackBehavior;
            }
            set
            {
                quackBehavior = value;
            }
        }

public IFlyBehavior FlyBehavoir
        {
            get
            {
                return flyBehavior;
            }
            set
            {
                flyBehavior = value;
            }
        }

public abstract object Display();

public object PerformFly()
        {
            return FlyBehavoir.Fly();
        }

public object PerformQuack()
        {
            return QuackBehavior.Quacking();
        }

public string Swim()
        {
            return "All ducks float, even decoys!";
        }
    }

/// <summary>
    /// MallardDuck.
    /// </summary>
    public class MallardDuck : Duck
    {
        public MallardDuck()
        {
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }

public override object Display()
        {
            return "I'm a real Mallard duck";
           
        }
    }

/// <summary>
    /// RedheadDuck
    /// </summary>
    public class RedheadDuck: Duck
    {
        public RedheadDuck()
        {
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }
       
        public override object Display()
        {
            return "I'm a Redhead duck";
        }
    }

/// <summary>
/// RubberDuck
/// </summary>
public class RubberDuck : Duck
{
    public RubberDuck()
    {
        quackBehavior = new Squeak();
        flyBehavior = new FlyNoWay();
    }
   
    public override object Display()
    {
        return "I'm a rubber duck";
    }
}

/// <summary>
/// ModelDuck Object
/// </summary>
public class ModelDuck : Duck
{
    public ModelDuck()
    {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

public override object Display()
    {
        return "I'm a model duck";
    }

}

/// <summary>
    /// DecoyDuck
    /// </summary>
    public class DecoyDuck: Duck
    {
        public DecoyDuck()
        {
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }
       
        public override object Display()
        {
            return "I'm a Decoy duck";
        }
    }

/// <summary>
/// IFlyBehavior interface for flying behaviors
/// </summary>
public interface IFlyBehavior
{
    object Fly();
}

/// <summary>
    /// FlyWithWings
    /// </summary>
    public class FlyNoWay : IFlyBehavior
    {
        public FlyNoWay()
        {}

#region IFlyBehavior Members

public object Fly()
        {
            return "I can't fly.";
        }

#endregion
    }

/// <summary>
    /// FlyWithWings
    /// </summary>
    public class FlyWithWings : IFlyBehavior
    {
        public FlyWithWings()
        {}

#region IFlyBehavior Members

public object Fly()
        {
            return "I'm flying!!";
        }

#endregion
    }

/// <summary>
    /// FlyRocketPowered
    /// </summary>
    public class FlyRocketPowered : IFlyBehavior
    {
        #region IFlyBehavior Members

public object Fly()
        {
            return "I'm flying with a rocket!";
        }

#endregion
    }

/// <summary>
    /// IQuackBehavior interface for Quacking behaviors
    /// </summary>
    public interface IQuackBehavior
    {
        string Quacking();
    }

/// <summary>
    /// Quack
    /// </summary>
    public class Quack : IQuackBehavior
    {
        public string Quacking()
        {
            return "Quack";
        }
    }

/// <summary>
    /// Squeak
    /// </summary>
    public class Squeak : IQuackBehavior
    {
        public string Quacking()
        {
            return "Squeak";
        }
    }

/// <summary>
    /// MuteQuack
    /// </summary>
    public class MuteQuack : IQuackBehavior
    {
        public string Quacking()
        {
            return "MuteQuack";
        }
    }

/// <summary>
    /// 入口类
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Duck mallard = new MallardDuck();
            Console.WriteLine(mallard.PerformFly());
            Console.WriteLine(mallard.PerformQuack());

Duck model = new ModelDuck();
            Console.WriteLine(model.PerformFly());
            Console.WriteLine(model.PerformQuack());

//动态改变飞行行为
            model.FlyBehavoir = new FlyRocketPowered();
            Console.WriteLine(model.PerformFly());
            Console.ReadKey();
        }
    }

Strategy.Duck源代码

转载于:https://www.cnblogs.com/JaiHome/p/3782332.html

《Head First 设计模式》之策略模式相关推荐

  1. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  2. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  4. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  5. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  6. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  7. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  8. 面向对象设计模式之策略模式

    面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...

  9. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  10. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. Wireshark安装失败或找不到网络接口问题
  2. Asp.net SignalR快速入门 ---- /signalr/hubs 404
  3. java 模块分离部署_GitHub - yangjiu/Mis: 模块接口服务,如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块?...
  4. 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析
  5. JVM 调优实战--jmap的使用以及内存溢出分析
  6. 如何在Java中将图像上传到DropBox
  7. windows2019域控降级退域
  8. 翻身的废鱼——论PHP从入门到放弃需要多久?13
  9. (转)解决RabbitMQ service is already present - only updating service parameters
  10. Q88:全局光照(Global Illumination)——Path Tracing
  11. Access、CorelDRAW总结
  12. 使用commons-compress操作zip文件(压缩和解压缩)
  13. 三菱FX3S,FX3G,FX3U序列PLC控制器编程手册-基本应用指令篇下载
  14. 高速PCB电路板的信号完整性设计
  15. 2023年辽宁大学马克思主义中国化研究考研上岸前辈备考经验指导
  16. 使用Bugzilla,你肯定会遇到的坑。
  17. C#使用Oxyplot绘制监控界面
  18. 我的JAVA面试经验(5年左右工作经验)
  19. 基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习
  20. 微信小程序 - 日期(起止)选择器组件

热门文章

  1. 只要活着,我愿意一辈子都做程序员
  2. python yaml PyYaml入门
  3. TOOM网上舆情应急处置预案,怎么加强网上舆情监控?
  4. 做培训直播时,企业还要做好社群运营
  5. 线性代数常用基本知识整理
  6. @SuppressLint(“XXXXXXX”)分析
  7. SAP中采购订单历史分类标识与实际业务描述
  8. 南京邮电大学操作系统实验五:Windows平台多进程共享内存通信
  9. 报错:NoSuchAlgorithmException: Algorithm HmacSHA1 not available
  10. 快速构建企业级应用的开发平台