刚入职的公司正在开发一款游戏DuckSim,它用了最传统的面向对象来设计各种类之间的关系:

display()是抽象的,因为不同种类的鸭子有不同的表现方式。
为了打败其它同类型游戏,产品经理提出了这个一个新的需求:“我们需要给我的的鸭子加一个fly()的功能!”
如何实现这个功能呢?最直接的方式,直接在父类Duck中添加fly()方法。

然而,在代码提交后的第二天,测试找到了我:“阿毅,你的代码有问题,直接把fly()加在Duck,但是并不是所有的鸭子都可以飞呀!

除此之外,RubberDuck的quack()方法应该与其它Duck不同,那么要如何解决这个问题呢?
第一次尝试:我们可以把quack()和fly()做成接口,对应的子类实现对应的接口即可。

然而,利用这种方法实现的话,会导致子类又大量重复的代码(如果两个种类的鸭子的fly()完全相同,它们不得不分别实现),更糟糕的是,如果有一天我们鸭子的飞行方式需要做修改,那么我们必须修改所有的类!
由此,引出两条设计规则:
1. 找出代码中相同的部分,把它们提取出来。
这样子做能够提高代码的复用性,需要添加新功能的时候,不需要修改公共的代码,减少bug发生几率。
2. 面向接口编程,而不是面向实现!。
这个由具体例子来解释。

OK,接下来回到问题,如何解决?

package designpattern.introduction;public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public void swim() {System.out.println("I can swim");}public abstract void display();public void performFly() {flyBehavior.fly();}public void performSquack() {quackBehavior.quack();}public static void main(String[] args) {Duck duck = new BlackDuck();duck.display();duck.performFly();duck.performSquack();duck = new RubberDuck();duck.display();duck.performSquack();duck.performFly();}}interface FlyBehavior {void fly();
}interface QuackBehavior {void quack();
}class FlyWithWing implements FlyBehavior {@Overridepublic void fly() {System.out.println("I can fly with wings");}
}class CanNotFly implements FlyBehavior {@Overridepublic void fly() {System.out.println("I cannot fly");}
}class QuackNoSound implements QuackBehavior {@Overridepublic void quack() {System.out.println("NO sound!");}
}class Squack implements QuackBehavior {@Overridepublic void quack() {System.out.println("squack");}
}class Quack implements QuackBehavior {@Overridepublic void quack() {System.out.println("Quack!!!");}
}class BlackDuck extends Duck {public BlackDuck() {flyBehavior = new FlyWithWing();quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("I'm a black duck");}
}class WhiteDuck extends Duck {public WhiteDuck() {flyBehavior = new FlyWithWing();quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("I'm a white duck");}
}class RubberDuck extends Duck {public RubberDuck() {flyBehavior = new CanNotFly();quackBehavior = new Squack();}@Overridepublic void display() {System.out.println("I'm a rubber duck");}
}

设计模式之设计模式入门相关推荐

  1. 软件设计模式介绍与入门

    目录 1.软件设计模式的起源 2.什么是设计模式? 2.1.设计模式的设计意图 2.2.设计模式的分类准则 3.为什么要学习设计模式 4.如何学习设计模式 5.最后 VC++常用功能开发汇总(专栏文章 ...

  2. 设计模式(35)-----设计模式阶段性总结(一句话概括一个模式)

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  3. 深入浅出设计模式之设计模式简介

    一.什么是设计模式(详见设计模式概念和七大原则) 在GoF(Gang of Four)的书籍<Design Patterns - Elements of Reusable Object-Orie ...

  4. 设计模式---适配器设计模式

    设计模式---适配器设计模式 什么事适配器: 1. 在使用监听的时候,需要定义一个类事件监听器接口 2. 通常接口中有多个方法,而程序中不一定所有的方法都用到,但又必须重写,很繁琐 3. 适配器简化了 ...

  5. 设计模式一の设计模式详解

    一.设计模式定义 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性 ...

  6. 结构设计模式 - 适配器设计模式

    结构设计模式 - 适配器设计模式 PANKAJ  17评论 适配器设计模式是结构设计模式之一,其使用使得两个不相关的接口可以一起工作.连接这些不相关接口的对象称为适配器. 目录[ 隐藏 ] 1适配器设 ...

  7. 行为设计模式 - 解释器设计模式

    行为设计模式 - 解释器设计模式 解释器设计模式是行为设计模式之一.解释器模式用于定义语言的语法表示,并提供解释器来处理该语法. 解释器设计模式 解释器设计模式的最佳示例是java编译器,它将java ...

  8. 行为设计模式 - 迭代器设计模式

    行为设计模式 - 迭代器设计模式 迭代器设计模式中的一种行为模式.迭代器模式用于提供遍历一组对象的标准方法.Iterator模式广泛用于Java Collection Framework.Iterat ...

  9. 行为设计模式 - Memento设计模式

    行为设计模式 - Memento设计模式 Memento 设计模式是行为设计​​模式之一.当我们想要保存对象的状态以便稍后可以恢复时,使用Memento设计模式.Memento模式用于实现这一点,使得 ...

  10. 行为设计模式 - 状态设计模式

    行为设计模式 - 状态设计模式 状态设计模式是行为设计​​模式之一.当Object根据其内部状态更改其行为时,将使用状态设计模式. 目录[ 隐藏 ] 1国家设计模式 1.1状态设计模式接口 1.2国家 ...

最新文章

  1. js前端导出excel:json形式的导出
  2. ajax学生校验学号,ajax校验数据库数据是否存在
  3. 【转】1.3异步编程:线程同步基元对象
  4. 一个简单的高并发的回应服务器(5万并发)
  5. java中几种常见字符集与乱码介绍
  6. python在化学中的应用_用Python配平化学方程式的方法
  7. C言语次序查找算法及代码
  8. sqlite 数据库 boolean类型的小小测试
  9. db2 sqlcode
  10. 操作系统形式化验证实践教程(1) - 证明第一个定理
  11. VGA驱动实现并下板EGO1
  12. 如何给拍好的短视频配音?最简单的方法推荐!
  13. 【python学习.油价和美元汇率查询】
  14. ic和mos怎么区分_MOS管和IGBT管的定义是什么与怎么辨别呢?
  15. 基于android的宠物领养系统
  16. 四面体的表面积_四面体表面积与体积的平分
  17. Brain Stimulation:深部脑刺激治疗难治性抑郁症的连接体分析
  18. [附源码]计算机毕业设计JAVA大学城二手书交易网站
  19. 杨洁篪揭幕中国驻美大使馆新馆(图)
  20. linux美元符号切换为井号,MyBatis中井号与美元符号的区别

热门文章

  1. 浅谈sPLS和sgPLS
  2. Web网页制作——花店网站(彼岸の花 偏安一隅)
  3. C语言初学知识准备(Linux方面)
  4. VMware虚拟机解决空间不足,增加磁盘空间(磁盘扩容)
  5. 自制COCO 实例分割dataset并测试效果(从采集到测试)
  6. 下一站天皇:Facebook ?
  7. win10系统安装到服务器失败怎么解决,重装系统win10失败怎么办 重装系统失败的常见原因和解决方法...
  8. 12 个好用且不花钱的网络监控工具
  9. 最近这只狗狗,真的很忙
  10. Sorry, name can only contain URL-friendly characters and name can no longer contain capital letters