package com.wfl.designmode;/*** 使用接口设计一个抽象功能方法,让具体类去实现接口中的不同方法;**//*需求:模拟鸭子叫、游泳、展示自己的外观、满足鸭子会飞,但是有些鸭子,比如橡胶鸭不能飞,只会咯吱咯吱叫* 分析:实现接口的方式是首先想到的,可以让所有不同的鸭子都会叫、游泳、展示自身外观** 解决方案1:那么最简单的方式就是在接口中添加flay方法,并且方所有的实现类去实现它,橡胶鸭子要覆盖这个方法设置为不能飞,quack方法设置为咯吱咯吱* 缺点:上面好像可以实现,但是不利于扩展,每当要增加其他鸭子,都要被迫检查可能要覆盖fly和quark(),比如诱饵鸭子不会飞、不会叫。。。* 总结:单纯使用实现+接口覆盖这种方式实现多种不同类型的实例是不友好的,加大了代码量,不好维护*/
public class FirstMode {
}/*** 第一步:定义鸭子接口,所有的鸭子实现类实现这个接口*/
interface duckInterface{/*** 鸭子叫*/void quack();/*** 鸭子游泳*/void swim();/*** 鸭子展示自己的外观*/void display();
}/*** 第二步:实现具体的鸭子类型*/
class MallardDuck implements duckInterface{@Overridepublic void quack() {System.out.println("MallardDuck quack");}@Overridepublic void swim() {System.out.println("MallardDuck swim");}@Overridepublic void display() {System.out.println("MallardDuck display");}
}/*** 第二步:实现具体的鸭子类型* ... 可以创建N多个鸭子类,这些鸭子都会游泳、叫、特技*/
class RedheadDuck implements duckInterface{@Overridepublic void quack() {System.out.println("RedheadDuck quack");}@Overridepublic void swim() {System.out.println("RedheadDuck swim");}@Overridepublic void display() {System.out.println("RedheadDuck display");}
}/* 解决方案2:将方法归类,一种是鸭子的公共的特征方法,比如display、swim;另外一种是特殊的方法,比如flay、quack;让鸭子去根据自身的情况去实现这两种接口
* 比如橡胶鸭子就不用实现flay方法所在的接口,
* 缺点:如果需要100个鸭子实体类,所有的鸭子类都去实现公共的接口,但是有许多鸭子实体类还需要稍微修改一下flay方法,代码无法复用。。。
* 总结:继承或实现的方式不能很好地解决问题,应为鸭子的行为在类中千变万化,让所有的鸭子都有这些行为是不恰当的。
*//*** 公共方法,鸭子都有外部特征display,都会游泳*/class Duck{void swim(){System.out.println("HolledDuck swim");}void display(){System.out.println("HolledDuck red head");}
}/*** 只有部分鸭子会飞、会叫*/
interface Flayable{void flay();
}interface Quackable{void quack();
}/*** 100多种鸭子,都要重写下面的方法*/
class HolledDuck extends Duck implements Flayable,Quackable{/*** 需要修改flay方法*/@Overridepublic void flay() {System.out.println("HolledDuck flay");}/*** 需要修改quack方法*/@Overridepublic void quack() {System.out.println("HolledDuck quack");}
}/*
* 设计原则1:找出应用中可能需要变化的地方,把它们独立(抽取)出来,不要和那些不需要变化的代码混合在一起。
*
* 使用设计模式的方案:鸭子类不再实现flayable等这些接口,我们设计专门的类来实现flayable接口,这种专门的类称为行为类
*                  以前的鸭子类要实现行为类的功能,这种方式都依赖于子类的实现,被绑的死死地,
*                  鸭子的子类直接使用行为类,组合的方式,
* */interface FlayBehavior{void flay();
}/*** 实现了所有有翅膀的鸭子的飞行*/
class FlayWithWings implements FlayBehavior{@Overridepublic void flay() {System.out.println("鸭子的飞行");}
}/*** 实现所有不会飞的鸭子的动作*/
class FlayNoWay implements FlayBehavior{@Overridepublic void flay() {System.out.println("什么都不做,不会飞");}
}interface QuackBehavior{void quack();
}/*** 实现真正的鸭子呱呱叫*/
class Quack implements QuackBehavior{@Overridepublic void quack() {System.out.println("鸭子呱呱叫");}
}/*** 实现了橡皮鸭子吱吱叫*/
class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("橡皮鸭子吱吱叫");}
}/*** 实现了不吭声的鸭子*/
class MutaQuack implements QuackBehavior{@Overridepublic void quack() {System.out.println("什么都不做,不会叫");}
}/*** 优点:1.让飞行和呱呱叫的动作行为类被其他对象复用,这些行为与鸭子本身类无关*      2.当新增一些行为,不会影响到飞行和呱呱叫等,也不会影响到使用飞行类的鸭子类*      3。有了继承的复用好处,但是没有继承所带来的报复** 具体实现:1.在Duck类中加入两个接口类型的实例变量,每个鸭子都会动态的设置这些变量,在运行时引用正确的行为类型*/class DDuck{public FlayBehavior flayBehavior;public QuackBehavior quackBehavior;/*** 鸭子对象不亲自处理呱呱叫的行为,而是委托给quackBehavior引用的对象* 想要呱呱叫就传Quack子类,想要吱吱叫就传Squeak,* 我们不用知道如何实现,只需要知道对象知道要怎样叫就行了*/public void performQuack(){quackBehavior.quack();}public void performFlay(){flayBehavior.flay();}/*** !!!在鸭子子类中通过设定方法来设置鸭子的行为,而不是构造器内部实例化**/public void setFlayBehavior(FlayBehavior fb){flayBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}
}/*
* 如何设置flayBehavior和quackBehavior
* 1.使用构造器
* 2.使用setter方法
* */class MallardDDuck extends DDuck{/*** 应为MallardDDuck继承了DDuck,拥有两个实例变量* 这里是默认的行为*/public MallardDDuck(){flayBehavior = new FlayWithWings();quackBehavior = new Quack();}/*** 鸭子的公共方法*/public void display(){System.out.println("real Mallard Duck");}
}/**测试类*/class testDuck{public static void main(String[] args) {DDuck mallred = new MallardDDuck();mallred.setFlayBehavior(new FlayNoWay());mallred.setQuackBehavior(new MutaQuack());mallred.performFlay();mallred.performQuack();}
}

设计模式(一)继承+组合相关推荐

  1. php中可以实现多态的是继承,PHP设计模式通过继承实现多态

    /* ?* WEB开发笔记 www.chhua.com 每日练习之PHP设计模式继承的实现 ?*/ /* ?* 类说明:某大学开两门课程,一个是PHP,一个是JAVA,规定不同的价格 ?*/ abst ...

  2. 设计模式学习笔记——组合(Composite)模式

    设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...

  3. Java基础之面向对象的概念 继承---组合----枚举类

    Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...

  4. 组合模式_设计模式结构性:组合模式(CompositePattern)

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  5. 设计模式(17)之组合模式

    一.前言 在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣服与衣柜.以及厨房中的锅碗瓢盆等.在软件 ...

  6. js 设计模式与继承学习

    设计模式 创建自定义对象的最简单方式是new 一个object对象,然后给它添加方法与属性 如: 1 var person = new Object(); 2 person.name = " ...

  7. 设计模式学习-Composite(组合模式)

    意图:将对象组合成树型结构以表示"部分-整体"的层次结构.Composite使得用户对于单个对象和组合对象的使用具有一致性 Compoite模式的关键是一个抽象类,即表示具体类也表 ...

  8. 面向对象 - 继承/组合 - 总结

    面向对象 - 继承:1.继承: 类与类之间的关系 什么是什么的关系 eg:人是动物 狗是动物 功能: 解决代码重用问题, 创建新类的方式, 类: 可继承一个或多个父类: 父类 == 基类/超类 类 = ...

  9. JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:"将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性." 就拿剪发办卡的事情来分析一下吧. 首先,一张 ...

最新文章

  1. iOS -数据库网络之xml解析之远程解析XML
  2. GCD介绍(一): 基本概念和Dispatch Queue (转载)
  3. buf.readInt32LE函数详解
  4. java xss 默认值_一台 Java 服务器可以跑多少个线程?
  5. 软件测试学习指南(更新中)
  6. linux配置路径,Linux下配置搜索路径
  7. java interruptedexception_如何正确的处理InterruptedException
  8. JAVA商城项目(微服务框架)——第4天 乐优商城项目搭建
  9. Python Pandas 列数据筛选方法汇总
  10. 「入门运维必看」一篇让小白彻底搞懂性能调优!
  11. 【图论最短路】【CQBZOJ 1633】【图论专项赛】位图
  12. 大数据实时案例--实时日志监控告警系统
  13. 杠铃策略,给你的“B计划”一个“阶层跃升”的机会
  14. 华为近场通讯nfc在哪里打开_华为手机怎么使用NFC功能?华为手机使用NFC交通卡功能教程...
  15. ubuntu离线安装python_Ubuntu离线安装软件包
  16. nmt模型源文本词项序列_TensorFlow NMT的数据处理过程
  17. SQLite 初学者注意事项
  18. 全志A10_linux3.0内核编译记录
  19. ERROR: The Compose file ‘./docker/docker-compose-test-net.yaml‘ is invalid because: networks.test va
  20. 为什么航班停在远机位?

热门文章

  1. [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结
  2. 福利 | 春节了,如何向七大姑八大姨解释我的程序员职业?
  3. 我对“什么是程序(Program)”的理解
  4. java xca,keytool 错误: java.lang.Exception: 所输入的不是 X.509 证书
  5. 如何处理前端js报错——容错处理的汇总
  6. 记录一个阿里云OSS图片上传错误
  7. Bugku WEB 秋名山车神
  8. lol网通服务器位置,《LOL》转区系统官网网址 转区系统在哪里怎么转区
  9. 启xin宝app的token算法破解——逆向篇(二)
  10. 我上了个假“中台”!