学习自HeadFirst 设计模式

入门主要理解多态

理解类 抽象类 接口之间的区别
理解超类子类的构造方法执行顺序,子类如何调用超类构造方法
理解子类重写覆盖超类方法,隐藏父类静态方法,静态方法的特别之处
理解子类向上转换类型(显式 隐式),超类向下强转的区别以及原因
理解子类向上转换类型之后调用方法以及静态方法有什么区别以及限制


文件布局如下

1、飞行行为

package duckSimulator.actions;public interface FlyBehavior {void fly();
}
package duckSimulator.actions.impl;import duckSimulator.actions.FlyBehavior;public class FlyNoWay implements FlyBehavior {@Overridepublic void fly() {System.out.println("无法飞行");}
}
package duckSimulator.actions.impl;import duckSimulator.actions.FlyBehavior;public class FlyWithWings implements FlyBehavior {@Overridepublic void fly() {System.out.println("可以飞行了");}
}

2、叫声行为

package duckSimulator.actions;public interface QuackBehavior {void quack();
}
package duckSimulator.actions.impl;import duckSimulator.actions.QuackBehavior;public class MuteQuack implements QuackBehavior {@Overridepublic void quack() {System.out.println("mute叫");}
}
package duckSimulator.actions.impl;import duckSimulator.actions.QuackBehavior;public class Squeak implements QuackBehavior {@Overridepublic void quack() {System.out.println("squeak叫");}
}

3、鸭子超类

package duckSimulator;import duckSimulator.actions.FlyBehavior;
import duckSimulator.actions.QuackBehavior;/**** 抽象类中的对象 无需通过实例化即可调用属性对象的方法* 可能是因为抽象类本身不能实例化*/
public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){};public abstract  void display();void performQuack(){quackBehavior.quack();}void performFly(){flyBehavior.fly();}void setFlyBehavior(FlyBehavior fly){this.flyBehavior=fly;}void setQuackBehavior(QuackBehavior quackBehavior){this.quackBehavior=quackBehavior;}
}

4、具体鸭子实现

package duckSimulator;import duckSimulator.actions.impl.FlyNoWay;
import duckSimulator.actions.impl.MuteQuack;public class DuckImpl extends Duck {public DuckImpl(){flyBehavior=new FlyNoWay();quackBehavior=new MuteQuack();}@Overridepublic void display() {System.out.println("DuckImpl");}
}

5、调用鸭子测试

package duckSimulator;/*
* 针对接口编程  的真正意思是  “针对超类型编程”
* 利用多态,程序可以针对超类型编程,在执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上
*针对超类型编程,更加具体而言就是声明的变量应该是一个接口或者抽象类,只要是具体实现此超类型的类产生的对象都可以指定给这个变量
* 对于接口或者抽象类实现 主要新增的方法或者属性无法通过超类声明的变量调用(涉及到继承知识),故这里针对超类型编程主要是重在实现多态而非新增行为
* Dog d=new Dog() 声明变量为Dog类型(是animal的具体实现),会造成针对具体实现编码
* Animal a=new Dog() 知道对象是狗,但是是通过Animal进行多态的调用
* 一个是通用  一个是具体类*/import duckSimulator.actions.impl.FlyWithWings;
import duckSimulator.actions.impl.Squeak;public class Main {public static void main(String[] args) {Duck test=new DuckImpl();test.performFly();test.performQuack();test.setFlyBehavior(new FlyWithWings());test.setQuackBehavior(new Squeak());test.performFly();test.performQuack();}
}

设计模式-鸭子模拟器相关推荐

  1. 设计模式-鸭子类型1

    什么是鸭子类型 如果走起来是鸭子,叫起来是鸭子,那么它就是鸭子.亦或者说,一个食物无论是面制品,还是豆制品,只要吃起来是牛肉味,它就是牛肉干. 鸭子类型-多态的示例 如果是初学者,看到一些编程思想的东 ...

  2. 设计模式之-降龙十八掌

    本文代码较多且综合了好几种设计模式使用,建议收藏或者慢慢观看. 本文将综合抽象工厂.组合模式.装饰器模式.适配器模式.观察者模式等模式运用在本例子中.对于不熟悉这些模式的读者可以阅读历史文章学习加强自 ...

  3. [Head First设计模式]身边的设计模式——适配器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  4. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  5. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  6. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  7. 12 模式的模式:复合模式

    1.引入 1.0 引入 使用模式最棒的方式,就是把它们从家里找出来同其他模式展开交互.你越多地使用模式就越容易发现它们一同现身在你的设计中.对于这些在设计中携手合作征服许多问题的模式,我们给它一个特别 ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]...

    一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口                            } ...

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

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

最新文章

  1. 【大数据学习】数学基础及应用
  2. LeetCode--167--两数之和 II - 输入有序数组
  3. RPAD()和LPAD()函数进行字符串的填充
  4. OEM status|start|stop
  5. php美化输入框代码,两句代码让你的zblogphp文章字段输入框加上ue编辑器功能
  6. phppage类封装分页功能_php显示页码分页类的封装
  7. 用python模拟评委打分_用vb 编写一个评委打分的程序1. 编写一个评委打分的程序,实现以下功能:a) 单击“评委给分”按钮时弹出InputBo...
  8. 卷积神经网络流程图_卷积神经网络
  9. java 反射 静态成员_java 利用反射获取内部类静态成员变量的值
  10. CetnOS 6.7安装Hive 1.2.1
  11. 有Excel、Tableau、PowerBI都能做数据分析,为什么还要用Python
  12. 【车间调度】基于matlab模拟退火算法求解车间调度(jobshop-3)问题【含Matlab源码 1082期】
  13. IEEE Access 模板大坑之添加子图
  14. Office 2016专业增强版加装Visio
  15. llinux默认ip修改方法
  16. hnust Snowman
  17. 表白php制作教程视频,表白视频制作神器,我们提供更加创新的方法制作表白视频...
  18. Maxon CINEMA 4D Studio R26.014 三维建模软件C4D R26
  19. HRBUST-1022 JiaoZhu and SC(C语言)
  20. Step to UEFI (137) 通过 BGRT 取得当前系统的 LOGO

热门文章

  1. speech api_如何使用Web Speech API构建文本语音转换应用
  2. Spark安装配置和基础编程
  3. [Java基础 持久层Mybatis] Mybatis使用IN语句查询
  4. 【树状数组】 小明爱拦截
  5. 迅雷之坑:java.io.IOException: 你的主机中的软件中止了一个已建立的连接
  6. 华为荣耀5X(畅玩版 全网通)USB调试模式如何开启教程(开发者模式 开发者选项打开)
  7. 天心系统服务器不能登录,天心系统日常用到的操作
  8. CAD制图初学入门教程:CAD机械软件中如何自定义参数栏?
  9. 微服务架构和SOA架构
  10. 海康DVR设备监控程序编制要点