package firstPro;
/*headfirst 设计模式第一章节 策略模式,模拟鸭子游戏,由于鸭子的颜色种类固定,不经常变动,所以把颜色相关函数放在超类Duck中,由于鸭子的fly和kua两个行为经常要变更,或者增加新的表现行为,大致先用以下两种方案:方案一:如果把该行为也放在Duck超类,以后每添加一个新行为,则所有子类都会继承该行为,包括那些不想添加该行为的子类,牵一发而动全身方案二:如果把该行为分别写在每一个鸭子子类中(如GreenDuck)则每一个子类都要单独写一个行为实现方法,而这些方法是有重复的,比如两种鸭子的飞行方式一样,但是要写两次。所以出现方案三,也就是策略模式,把经常发生变化(增加或者删除)的行为单独放在另一个分支,通过把鸭子的行为与鸭子分开,形成算法簇
设计模式原则:多用组合,少用继承*/abstract class Duck      //超类鸭子类,甭管什么鸭子都要从这里继承鸭子属性和方法
{FlyBehave flybehave;KuaBehave kuabehave;abstract public void display();    //抽象方法,所有子类必须提供该方法具体实现,因为鸭子的外貌必须要有public void setFly(FlyBehave flybehavior)   //给外部提供一个接口可以实现动态改变flybehave的值,也就是动态改变鸭子飞行行为{this.flybehave = flybehavior;  //这里用到了多态,在运行时动态的改变鸭子行为}public void performFly() //表现鸭子飞行的特征,这里用到了{this.flybehave.Fly();  //同样用到了多态,动态的根据鸭子飞行方式的类型来表现飞行特征}public void setKua(KuaBehave kuabehavior)    //给外部提供一个接口可以实现动态改变kuabehave的值,也就是动态改变鸭子叫的行为{this.kuabehave = kuabehavior;}public void performKua(){this.kuabehave.Kua();}}class GreenDuck extends Duck //创建一个稍微具体的鸭子类型,继承自超类Duck,名绿鸭子
{public GreenDuck() //在构造函数内部一定要实现鸭子飞行行为与叫的行为,否则该鸭子实例化后就没有指定行为{this.flybehave = new FlyWithWings();    //指定绿鸭子用翅膀 飞this.kuabehave = new Qiqi();   //指定绿鸭子唧唧叫}public void display(){System.out.println("im a green duck");   //指定绿鸭子的外观为一个绿色的鸭子}
}interface FlyBehave        //关于鸭子飞行行为的接口,实现该接口才可实现具体飞行行为
{public void Fly(); //接口声明一个鸭子飞行行为的函数
}
class FlyWithWings implements FlyBehave //该类实现了鸭子飞行的一个行为,用翅膀飞行
{public void Fly(){System.out.println("im flying with wings");}
}
class NoFly implements FlyBehave    //该类实现了鸭子飞行的一个行为,不会飞
{public void Fly(){System.out.println("i can't fly");}
}
interface KuaBehave //关于鸭子叫的接口,实现该接口才可实现具体叫的行为
{public void Kua();
}class Qiqi implements KuaBehave    //该类实现了鸭子叫的一个行为,唧唧叫
{public void Kua(){System.out.println("i make sound with qiqi");}
}class Kuakua implements KuaBehave  //该类实现了鸭子叫的一个行为,呱呱叫
{public void Kua(){System.out.println("i make sound with kuakua");}
}class NoKua implements KuaBehave   该类实现了鸭子叫的一个行为,不会叫
{public void Kua(){System.out.println("i can't make sound");}
}class CHello
{public static void  main(String[] args){Duck greenduck = new GreenDuck(); //实例化一个绿鸭子greenduck.display();  //展现鸭子的外观greenduck.performFly();        //鸭子展现下飞行方式greenduck.setFly(new NoFly());   //设置鸭子的飞行方式为不会飞greenduck.performFly();  //再次展现鸭子飞行方式,结果是不会飞}
}

设计模式之策略模式:模拟鸭子相关推荐

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

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

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

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

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

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

  4. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composi ...

  5. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. 设计模式之策略模式、观察者模式浅析

    head first 设计模式 这本书上学的时候就买了,一直没看,最近下班后实在是不想对着电脑,就翻了翻以前没看的书,看到<head first 设计模式>后,发现这本书写的真不错啊 强烈 ...

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

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

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

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

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

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

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

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

最新文章

  1. DLINQ *.dbml文件该属于哪一层
  2. boost::interprocess::ipcdetail::private_adaptive_node_pool用法的测试程序
  3. easyuefi无法安装只能在基于_SOLIDWORKS2018安装时VC2015安装失败的解决方法
  4. 用 radial-gradient 实现波浪效果
  5. Unity设置为中文
  6. 如何写php大马,带你走进php大马的结构模块编写之路
  7. win10系统无法删除文件提示找不到该项目解决办法
  8. 「ZigBee模块」基础实验(1)点亮LED
  9. 适合老爸用的在线的LaTeX数学公式编辑器
  10. 退欧令英国科技业措手不及,可能不再享受多项利好政策
  11. 创建选区快捷键是什么_PS如何移动和取消选区?快捷键是什么? - PS自学网
  12. 序列化-Kryo的使用详解
  13. 思维模型 第一性原理
  14. leetcode 19. 删除链表的倒数第 N 个结点(c++)
  15. Codeforces 1247D. Power Products (logn质因数分解)
  16. 基于点线特征的激光雷达+单目视觉里程计
  17. 中国史上战斗力最强的5支部队(冷兵器时代)
  18. 银河麒麟+WIN10双系统安装
  19. 微信小程序routeDone错误问题
  20. 为什么有的人说话一定要带手势?生物学基础找到了

热门文章

  1. firefox linux 关闭,Firefox 的 Flash 被禁用的解决方法
  2. 键盘无响应-如何修复键盘注册表
  3. java的程序员工资一般多少_JAVA程序员工资一般是多少
  4. 深度学习: 指数加权平均
  5. 英语单词之说文解字(7)
  6. KataGo线程/权重/显卡
  7. 排列组合解析与例题总结
  8. RoboCup3D仿真2019年国赛TC笔记
  9. 树莓派安装中文输入法(谷歌拼音)
  10. 支付宝支付对账单java_[Java]解析支付宝对账单csv