策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
    abstract class Strategy{// Methodsabstract public void AlgorithmInterface();}// "ConcreteStrategyA"class ConcreteStrategyA : Strategy{// Methodsoverride public void AlgorithmInterface(){Console.WriteLine("Called ConcreteStrategyA.AlgorithmInterface()");}}// "ConcreteStrategyB"class ConcreteStrategyB : Strategy{// Methodsoverride public void AlgorithmInterface(){Console.WriteLine("Called ConcreteStrategyB.AlgorithmInterface()");}}// "Context"class Context{// Fields
        Strategy strategy;// Constructorspublic Context(Strategy strategy){this.strategy = strategy;}// Methodspublic void ContextInterface(){strategy.AlgorithmInterface();}}/// <summary>/// Client test/// </summary>public class Client{public static void Main(string[] args){// Three contexts following different strategiesContext c = new Context(new ConcreteStrategyA());c.ContextInterface();}}

using System;namespace ConsoleApplication1
{#region 继承实现public class Duck{public void Quack() { Console.WriteLine("Quack"); }public virtual void DisPlay() { Console.WriteLine("DisPlay"); }}public class MallardDuck : Duck{public override void DisPlay() { Console.WriteLine("green"); }}public class RedHeadDuck : Duck{public override void DisPlay() { Console.WriteLine("red"); }}public class RubberDuck : Duck{public override void DisPlay() { Console.WriteLine("black"); }}/* 新需求:需要加入Fly方法,但RubberDuck不应该有Fly的属性* 新需求:需要加入新的Duck种类DecoyDuck,但DecoyDuck不会飞也不会叫*//*问题* 代码在多个子类中重复* 新增加的Duck很难预知其行为* 运行时的行为不容易改变 * 牵一发动全身*/#endregion#region 接口实现public class Duck1{public void Quack() { Console.WriteLine("Quack"); }public virtual void DisPlay() { Console.WriteLine("DisPlay"); }}public interface IFly{void Fly();}public class MallardDuck1 : Duck1, IFly{public override void DisPlay() { Console.WriteLine("green"); }public void Fly(){Console.WriteLine("MallardFly");}}public class RedHeadDuck1 : Duck1, IFly{public override void DisPlay() { Console.WriteLine("red"); }public void Fly(){Console.WriteLine("RedHeadFly");}}public class RubberDuck1 : Duck1{public override void DisPlay() { Console.WriteLine("black"); }}/* 多种Duck实现IFly内的Fly接口都要编写相关Fly的代码,相同的Fly功能代码无法重用。 */#endregion#region 优化/* 方案* 多个Duck相同代码的提取重复利用* 将变化的功能(Fly)提取成单独的行为实现类* 运行时可以动态的赋予Duck的Fly类型 */

  /* 这例子真是绝了。。。Duck2基类里有IFlyBehavior接口。。。不会飞的鸭子继承了,看起来是什么鬼样子。。。 */
public class Duck2{public void Quack() { Console.WriteLine("Quack"); }public virtual void DisPlay() { Console.WriteLine("Black"); }public IFlyBehavior m_flyBehavior;public void FlyPerform(){m_flyBehavior.Fly();}}// 行为类public interface IFlyBehavior{void Fly();}public class FlyBehaviorA : IFlyBehavior{public void Fly(){Console.WriteLine("FlyA");}}public class FlyBehaviorB : IFlyBehavior{public void Fly(){Console.WriteLine("FlyB");}}public class MallardDuck2 : Duck2{public MallardDuck2(IFlyBehavior iFly){m_flyBehavior = iFly;}public override void DisPlay() { Console.WriteLine("green"); }}public class RedHeadDuck2 : Duck2{public RedHeadDuck2(IFlyBehavior iFly){m_flyBehavior = iFly;}public override void DisPlay() { Console.WriteLine("red"); }}public class RubberDuck2 : Duck2{public override void DisPlay(){base.DisPlay();}}#endregionclass DuckFactory{public enum DuckType{MALLARD,REDHEAD,RUBBER}public static Duck2 CreateDuck(DuckType type){switch (type){case DuckType.MALLARD:return new MallardDuck2(new FlyBehaviorA());case DuckType.REDHEAD:return new RedHeadDuck2(new FlyBehaviorB());case DuckType.RUBBER:return new RubberDuck2();default:Console.WriteLine("Type Error...................");return null;}}}class Program{static void Main(string[] args){Duck2 mallard = DuckFactory.CreateDuck(DuckFactory.DuckType.MALLARD);mallard.m_flyBehavior.Fly();Console.ReadKey();}}}

转载于:https://www.cnblogs.com/HelloUnity/p/5712155.html

鸭子应用--策略模式相关推荐

  1. Head First设计模式一:策略模式

    前言:最近在看Head First设计模式,有所收获记录总结一下,今天说一下策略模式解决的问题. <1> 策略模式是根据外部不同的需求选择不同的策略来解决不同需求的问题. <2> ...

  2. 设计模式随笔系列:鸭子-策略模式(Strategy)

    鸭子-策略模式(Strategy) 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜 ...

  3. 设计模式随笔系列:鸭子-策略模式(Strategy)[原]

    原文地址为: 设计模式随笔系列:鸭子-策略模式(Strategy)[原] 鸭子-策略模式(Strategy) 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所 ...

  4. 鸭子-策略模式(Strategy)[原]

    鸭子-策略模式(Strategy) 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜 ...

  5. 鸭子在叫哟,嘎嘎嘎---策略模式

    你看那里有只小鸭哟,你看那里又只小鸭哟~小鸭嘎嘎嘎-ga-哟~小鸭嘎嘎嘎-ga-哟~ 矮油我艹,居然被这神曲给洗脑了.现在一看到小动物就莫名其妙的会哼唱起来,那么问题来了,长颈鹿怎么叫?"好 ...

  6. 打印鸭子戏水java,《Head first设计模式》学习笔记 #8211; 策略模式,

    <Head first设计模式>学习笔记 – 策略模式, 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 假设有一个模拟鸭子的游戏,游 ...

  7. 设计模式解读之一: 策略模式——鸭子游戏

    设计模式解读之一: 策略模式--鸭子游戏 当我们掌握了Java的语法,当我们了解了面向对象的封装.继承.多态等特性,当我们可以用Swing.Servlet.JSP技术构建桌面以及Web应用,不意味着我 ...

  8. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  9. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  10. 【设计模式】java设计模式之 -- 策略模式

    对于代码中总是会有需要变化的部分和需要固定不变的部分.对于需要变化的部分,一般可以采用继承的方式,让子类对父类的方法进行重写,以改变已有的行为:如果变化的部分并不是所有子类都必须要有的,那就可以采用接 ...

最新文章

  1. java正则表达式 s报错_Java基础--正则表达式的规则
  2. 【简便解法】1079 延迟的回文数 (20分)_31行代码AC
  3. android 回归测试,android测试:monkey使用方法
  4. Ubuntu14.04安装与卸载ROS(避坑教程)配kinetic版本安装官方网址
  5. Java开发知识之Java的包装类
  6. 构建复杂的应用程序 —— 重用与重构
  7. Mac下IDEA快捷键操作
  8. 第二章 用户画像建模
  9. 实验九 哈希表的查找操作
  10. Hibernate的下载与配置
  11. easyui select 默认选中指定值
  12. JavaScript ,js基础
  13. 桥架算量用什么软件_鹏业安装算量软件识别桥架
  14. 了解 InfoPath 2007十大优势
  15. python下载音乐代码_基于Python实现下载网易音乐代码实例
  16. 网络——数据交换方式
  17. 移植 u-boot-2020.07 到 iTOP-4412(二)地址相关码 boot
  18. Python 用 OpenCV 画椭圆 (5)
  19. NO7 显式的终结方法
  20. 语义分割是如何做到颜色分明的

热门文章

  1. 如何解决浏览器未安装FLASH控件的提示
  2. 深度解析反思型Essay怎么写?
  3. CF卡显示位置不可用无法访问介质受写入保护怎么办
  4. 台式计算机时间不能同步,台式电脑时间同步不了?一分钟就能快速解决
  5. 简单网页制作html语言,用HTML语言制作简单的网页.doc
  6. 51单片机60秒倒计时 数码管显示
  7. N卡显卡驱动更新,解决色彩准确度增强的问题
  8. 鸿蒙5G的营业执照,华为鸿蒙系统疑似被曝光 工信部向三大运营商颁发5G牌照​...
  9. mysql 父子关系查询,父子关系-SQL查询
  10. raspberrypi连接神经计算棒人脸识别