ü  设计原则1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
例如:对于一个鸭子类,不同的鸭子(真鸭子,木头鸭子等)有不同的飞行行为,呱呱叫行为,所以要把这两个行为从鸭子类中分离出来,在鸭子类中只保存那些不变的部分。
ü  设计原则2:针对接口编程而不是针对实现编程。
这里的接口有多个含义,它可以是java中的interface,也可以是抽象类。“针对接口编程”,关键就在多态。利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。“针对超类型编程”这句话,可以更明确地说成“变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量。
举个例子:
假设有一个抽象类Animal,其下有两个实现类 Dog和Cat继承自Animal。做法如下:
² 针对实现编程:
Dog dog = new Dog();
bj.bark();
注:声明变量“dog” 为Dog类型(是Animal的具体实现),会造成我们必须针对具体实现编码。
² 针对接口/抽象类编程:
Animal animal = new Dog();
Animal.makeSound();
注:利用animal进行多态的调用。

设计原则3:多用组合(composition),少用继承

使用组合建立系统具有很大的弹性,不仅可将行为封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。
 
    例如:在设计原则一中我们把“飞行行为”和“呱呱叫行为”这两个变化的行 为从鸭子类中分离出来。这里我们就设计这两个行为和鸭子类:
以上     以上为两个行为接口和它的实现类。此时我们要做的就是把两个行为整合到鸭子类中,具体怎么整合?继承吗?继承只能继承一个特定的类,因此用继承将不能“在运行时动态地改变行为”。那么我们选用组合。
        在Duck类中“加入两个实例变量”,分别为“flyBehavior”与“quackBehavior”,声明为接口类型(而不是具体类实现类型),每个鸭子对象都会动态地设置这些变量以在运行时引用正确的行为类型(例如:FlyWithWings、Squeak等)。
此时我们就把两个行为组合到Duck类中了,既然使用了组合,我们怎么在运行时动态地改变行为呢?如下我们写一个main函数来看看:
    public static void mian(String args[]){
       Duck duck = new Duck();
       duck.setFlyBehavior(new FlyNoWay());
       duck.setQuackBehavior(new Quack());
       //此时若想要鸭子能飞,我们可以通过setter方法在运行时动态地改变行为
       duck.setFlyBehavior(new FlyWithWings());
    }
         Sping中依赖注入(IOC)使用的就是组合。

本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/193800,如需转载请自行联系原作者

《Head.First设计模式读书笔记》之设计原则一、二和三相关推荐

  1. 大话设计模式读书笔记

    主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...

  2. 设计模式系列,六大设计原则

    设计模式和性能优化有没有关系?最近,我看到有人再讲性能优化的时候,讲到了"有些设计模式可以做到一定程度的性能优化". 我读书少,别骗我.我看过无数篇设计模式了,第一次听到有人说,设 ...

  3. 举例说明层次分析的三大原则_设计模式系列,六大设计原则

    设计模式和性能优化有没有关系?最近,我看到有人再讲性能优化的时候,讲到了"有些设计模式可以做到一定程度的性能优化". 我读书少,别骗我.我看过无数篇设计模式了,第一次听到有人说,设 ...

  4. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  5. Java 设计模式总结及六大设计原则

    设计模式总结 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式. ...

  6. java设计模式总结之六大设计原则(有图有例子)

    转载:https://www.cnblogs.com/jpfss/p/9765239.html 下面来总结下自己所学习的设计模式,首先我们看下各个模式之间的关系图,下面这张图是网上比较典型的一个类图关 ...

  7. 引用防删——JAVA设计模式总结之六大设计原则

    JAVA设计模式总结之六大设计原则 从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9 ...

  8. Java设计模式总结——6大设计原则

    从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...

  9. JAVA设计模式总结之六大设计原则(一)

    从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...

  10. JavaScript设计模式读书笔记(一)= 创建型设计模式

    全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...

最新文章

  1. Android监听应用程序安装和卸载
  2. Linux中一些常用的很巧妙的命令
  3. ZPan私人网盘 v1.4.1
  4. Android笔记:invalidate()和postInvalidate() 的区别及使用(转载)
  5. 翁恺老师C语言学习笔记(九)数组的运算
  6. Spice Windows Client 利用 USBDk 实现USB重定向
  7. 2020年日历电子版(打印版)_2020年日历打印版下载
  8. 偷得浮生半日闲--php入门
  9. 2020-04-17
  10. 开发模式和软件系统开发
  11. Chromedriver适用谷歌浏览器的各个版本
  12. 10000php换人民币,转 数字转大写人民币
  13. Python数据分析之商品数据分析
  14. 某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容30桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为5个。每次入、取缸水仅为
  15. 最新干货get,手机相机项目的整体测试流程是怎样的?
  16. 深圳市半导体行业协会会长周生明率队赴加速科技调研
  17. YL工作记录 (不断更新) -- 2020.04
  18. 绿盟web应用防火墙(主机版)中国教育和科研计算机网,绿盟远程安全评估系统NSFOCUS RSAS...
  19. e-人事管理系统-招聘管理-人才库
  20. 曾航:2014年移动互联网流量趋势

热门文章

  1. golang 监听服务的信号,实现平滑启动,linux信号说明
  2. thinkphp 多字段排序
  3. 选择排序、冒泡排序、异或运算
  4. Docker入门与实战
  5. libvirt热迁移报Connection refused错误解决办法
  6. undefined reference to `__isnanf'
  7. 解密 Go interface 的类型转换原理
  8. Laravel核心解读 -- 扩展用户认证系统
  9. 小提琴机器人拉法_小提琴的拉琴姿势探讨
  10. 图文详解什么是OAuth2