这篇博文是对前一篇博文《设计模式1:找出应用中可能需要变化之处,把它们独立出来》的一个延伸思考:在鸭子里建立了一堆动态的功能没有用到,太可惜了!假设我们想在鸭子子类中通过“设定方法(setter method)”来设定鸭子的行为,而不是在鸭子的构造器内实例化,那应该如何操作呢?

1.首先我们要在Duck类中加入两个新的方法:

Duck类(Duck.java)(粗体为新加入的两个方法)

  1. public abstract class Duck {
  2. FlyBehavior flyBehavior;
  3. QuackBehavior quackBehavior;
  4. public Duck(){
  5. }
  6. public abstract void display();
  7. public void performFly(){
  8. flyBehavior.fly();
  9. }
  10. public void performQuack(){
  11. quackBehavior.quack();
  12. }
  13. public void swim(){
  14. System.out.println("All ducks float, even decoys!");
  15. }
  16.  public void setFlyBehavior(FlyBehavior fb){ 
  17.         flyBehavior=fb; 
  18.     } 
  19.     public void setQuackBehavior(QuackBehavior qb){ 
  20.         quackBehavior=qb; 
  21.     } 
  22. }

2.模仿上一篇中的MallardDuck制作一个新的鸭子类型:模型鸭子(ModelDuck.java)

  1. public class ModelDuck extends Duck{
  2. public ModelDuck(){
  3. flyBehavior=new FlyNoWay();
  4. quackBehavior=new Quack();
  5. }
  6. public void display(){
  7. System.out.println("I'm a model duck");
  8. }
  9. }

3.同样模仿上一篇的FlyNoWay制作一个新的FlyBehavior类型(FlyRocketPowered.java)

  1. public class FlyRocketPowered implements FlyBehavior{
  2. public void fly(){
  3. System.out.println("I'm flying with a rocket!");
  4. }
  5. }

4.接下来才开始比较令人兴奋的地方:改变测试类(MiniDuckSimulator.java),加入模型鸭子,并使模型鸭子具有火箭动力。

  1. public class MiniDuckSimulator {
  2. public static void main(String[] args){
  3. Duck mallard=new MallardDuck();
  4. mallard.performQuack();
  5. mallard.performFly();
  6. mallard.display();
  7. Duck model=new ModelDuck();
  8. model.performFly();
  9. model.setFlyBehavior(new FlyRocketPowered());
  10. model.performFly();
  11. model.display();
  12. }
  13. }

5.测试结果

转载于:https://blog.51cto.com/luckylouis/775715

设计模式1【续】:动态设定行为相关推荐

  1. Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51508132 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  2. Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

    最近有个需求一次要打包多个类型的App,而且常量和String.xml都有变量.虽然之前也是一直存在变量,但是每次也仅仅只打包一个.这让我每次改变量,打包9个.要是以后每次都打包9次,我得疯了. 根据 ...

  3. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  4. 设计模式之----Java动态代理模式

    在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...

  5. 设计模式之_动态代理_06

    package com.learn.proxy;public class Client {public static void main(String[] args) throws Exception ...

  6. 设计模式之_动态代理_05

    package com.learn.proxy;public class Client {public static void main(String[] args) {Tank t = new Ta ...

  7. 设计模式之_动态代理_02

    package com.learn.proxy;/*** JDK的那个类就叫Proxy* @author Leon.Sun**/ public class Proxy {/*** 这个方法就是用来产生 ...

  8. 设计模式之_动态代理_03

    我们假设被代理的对象实现了一个接口,不管它实现了什么样的接口,但是它实现了一个接口,用集成也可以实现代理,但是继承不好,所以我们被代理的类要实现一个接口,这个在Spring也是这么要求的,不过Spri ...

  9. 设计模式之_动态代理_01

    package com.learn.proxy;import java.util.Random;/*** 产生了坦克这么一个类* 坦克当然是可以移动的,实现了接口,实现了move方法* 我想知道一个方 ...

最新文章

  1. 国内大陆芯片70个细分领域重要代表企业!
  2. python个人博客网站的搭建说明书_个人博客搭建线上实施方案
  3. 符号说明表怎么做_教会你的孩子正确使用标点符号
  4. JavaScript 读写 span标签的值 - 代码篇
  5. 数据结构 二叉搜索树BST的实现与应用
  6. ThinkPHP 使用极光推送给ios推送消息
  7. oracle 相关1
  8. 动软.Net代码自动生成器下载
  9. CAS学习笔记(三)—— SERVER登录后用户信息的返回
  10. 舍得网开发者碰到的问题及解决(转)
  11. 创业维艰-公司业务解决方案推荐!
  12. MySQL——页和索引
  13. pycharm 自定义区域折叠代码
  14. 腾讯云你的凭证不工作
  15. bash:xxxx: 权限不够解决办法
  16. PAT乙级 | 1094 谷歌的招聘 (20分)
  17. (1)一次意外的屠魔之旅
  18. 不需要任何化学药剂的污水处理设备(微纳米气泡技术)
  19. 生产者消费者模型详解
  20. 淘宝年货节红包来了,2021年淘宝年货节红包开抢时间表

热门文章

  1. 03-13 微信小程序自动化测试
  2. 三星堆的青铜机器人_三星堆“青铜纵目人像”到底仿照谁的相貌?专家终于讲出真相...
  3. Java开发者需要掌握的基础知识
  4. 前端开发使用react实现简易路由
  5. 学习web前端要了解的HTML5知识有哪些?
  6. 6个web前端核心技术,你学到哪个了呢?
  7. linux文件类型为目录,在Linux系统中,基本的文件类型分为()文件,目录文件和文件, 所有的I/..._考试资料网...
  8. OPencv_边缘检测算法
  9. JS ||(或运算)详解
  10. 计算机应用基础word教程,计算机应用基础-文字处理word教程PPT课件.ppt