设计模式1【续】:动态设定行为
这篇博文是对前一篇博文《设计模式1:找出应用中可能需要变化之处,把它们独立出来》的一个延伸思考:在鸭子里建立了一堆动态的功能没有用到,太可惜了!假设我们想在鸭子子类中通过“设定方法(setter method)”来设定鸭子的行为,而不是在鸭子的构造器内实例化,那应该如何操作呢?
1.首先我们要在Duck类中加入两个新的方法:
Duck类(Duck.java)(粗体为新加入的两个方法)
- public abstract class Duck {
- FlyBehavior flyBehavior;
- QuackBehavior quackBehavior;
- public Duck(){
- }
- public abstract void display();
- public void performFly(){
- flyBehavior.fly();
- }
- public void performQuack(){
- quackBehavior.quack();
- }
- public void swim(){
- System.out.println("All ducks float, even decoys!");
- }
- public void setFlyBehavior(FlyBehavior fb){
- flyBehavior=fb;
- }
- public void setQuackBehavior(QuackBehavior qb){
- quackBehavior=qb;
- }
- }
2.模仿上一篇中的MallardDuck制作一个新的鸭子类型:模型鸭子(ModelDuck.java)
- public class ModelDuck extends Duck{
- public ModelDuck(){
- flyBehavior=new FlyNoWay();
- quackBehavior=new Quack();
- }
- public void display(){
- System.out.println("I'm a model duck");
- }
- }
3.同样模仿上一篇的FlyNoWay制作一个新的FlyBehavior类型(FlyRocketPowered.java)
- public class FlyRocketPowered implements FlyBehavior{
- public void fly(){
- System.out.println("I'm flying with a rocket!");
- }
- }
4.接下来才开始比较令人兴奋的地方:改变测试类(MiniDuckSimulator.java),加入模型鸭子,并使模型鸭子具有火箭动力。
- public class MiniDuckSimulator {
- public static void main(String[] args){
- Duck mallard=new MallardDuck();
- mallard.performQuack();
- mallard.performFly();
- mallard.display();
- Duck model=new ModelDuck();
- model.performFly();
- model.setFlyBehavior(new FlyRocketPowered());
- model.performFly();
- model.display();
- }
- }
5.测试结果
转载于:https://blog.51cto.com/luckylouis/775715
设计模式1【续】:动态设定行为相关推荐
- Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51508132 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...
- Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)
最近有个需求一次要打包多个类型的App,而且常量和String.xml都有变量.虽然之前也是一直存在变量,但是每次也仅仅只打包一个.这让我每次改变量,打包9个.要是以后每次都打包9次,我得疯了. 根据 ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
- 设计模式之----Java动态代理模式
在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...
- 设计模式之_动态代理_06
package com.learn.proxy;public class Client {public static void main(String[] args) throws Exception ...
- 设计模式之_动态代理_05
package com.learn.proxy;public class Client {public static void main(String[] args) {Tank t = new Ta ...
- 设计模式之_动态代理_02
package com.learn.proxy;/*** JDK的那个类就叫Proxy* @author Leon.Sun**/ public class Proxy {/*** 这个方法就是用来产生 ...
- 设计模式之_动态代理_03
我们假设被代理的对象实现了一个接口,不管它实现了什么样的接口,但是它实现了一个接口,用集成也可以实现代理,但是继承不好,所以我们被代理的类要实现一个接口,这个在Spring也是这么要求的,不过Spri ...
- 设计模式之_动态代理_01
package com.learn.proxy;import java.util.Random;/*** 产生了坦克这么一个类* 坦克当然是可以移动的,实现了接口,实现了move方法* 我想知道一个方 ...
最新文章
- 国内大陆芯片70个细分领域重要代表企业!
- python个人博客网站的搭建说明书_个人博客搭建线上实施方案
- 符号说明表怎么做_教会你的孩子正确使用标点符号
- JavaScript 读写 span标签的值 - 代码篇
- 数据结构 二叉搜索树BST的实现与应用
- ThinkPHP 使用极光推送给ios推送消息
- oracle 相关1
- 动软.Net代码自动生成器下载
- CAS学习笔记(三)—— SERVER登录后用户信息的返回
- 舍得网开发者碰到的问题及解决(转)
- 创业维艰-公司业务解决方案推荐!
- MySQL——页和索引
- pycharm 自定义区域折叠代码
- 腾讯云你的凭证不工作
- bash:xxxx: 权限不够解决办法
- PAT乙级 | 1094 谷歌的招聘 (20分)
- (1)一次意外的屠魔之旅
- 不需要任何化学药剂的污水处理设备(微纳米气泡技术)
- 生产者消费者模型详解
- 淘宝年货节红包来了,2021年淘宝年货节红包开抢时间表
热门文章
- 03-13 微信小程序自动化测试
- 三星堆的青铜机器人_三星堆“青铜纵目人像”到底仿照谁的相貌?专家终于讲出真相...
- Java开发者需要掌握的基础知识
- 前端开发使用react实现简易路由
- 学习web前端要了解的HTML5知识有哪些?
- 6个web前端核心技术,你学到哪个了呢?
- linux文件类型为目录,在Linux系统中,基本的文件类型分为()文件,目录文件和文件, 所有的I/..._考试资料网...
- OPencv_边缘检测算法
- JS ||(或运算)详解
- 计算机应用基础word教程,计算机应用基础-文字处理word教程PPT课件.ppt