1.盆友们,其实这个问题挺简单的,还记得单纯我们为啥选择定义接口呀抽象类呀(这些框架、模板的)吗?

大白话--“方便批量生产”+ “不破坏原有类结构”。

(最后会放上接口和继承重写的作用的哈)

记住“方便批量生产” + 不破化基础上再扩展,现在回过头来思考添加装饰器的作用就很简单啦。

在实际的应用开发中,我们知道,实现了一开始定义好的接口的子类已经有好多个了,但是现在我们有了新的需求是想要拥有好多个在原来子类的继承上功能得到扩展的新子类。于是乎,为了批量生产这批添加了新功能的子类,我们选择了装饰器,做到了在不破坏原有的类的结构基础上进行扩展。同时还避免了两个尴尬:

(1)如果选择修改原来接口导致的麻烦是,原来那批实现接口的子类都需要需改了;

(2)如果选择在实现原来接口的基础上,每个实现类添加上新功能,太多子类啦!!!

2.所以我们选择了装饰器(封装原有的类,通过依赖关系实现扩展功能)。

首先我们定义了一个抽象类的装饰器实现原来接口,然后定义一个接口对象属性,(为了封装原有的类),通过定义带参构造方法,把接口对象作为参数。装饰器的好处是做到了不破坏原有的类的结构的基础进行了扩展。

为啥要定义成抽象类的装饰器呢,复习一下抽象类的作用就迎刃而解啦。

3.代码应用举例:

package BiscuitsDemo;public class BiscuitsTest {public static void main(String[] args) {//定义一个圆形烧饼对象
//        Biscuits biscuits = new RoundedBiscuits();    //使用多态啦RoundedBiscuits biscuits = new RoundedBiscuits();PetaloidBiscuits petaloidBiscuits = new PetaloidBiscuits(biscuits);petaloidBiscuits.rounded();}
}package BiscuitsDemo;
/*** 烧饼接口,定义烙印圆形烧饼抽象方法* @author **/
public interface Biscuits {//烙印圆形烧饼void rounded();
}package BiscuitsDemo;
/*** 圆形烧饼类(常见烧饼)* @author **/
public class RoundedBiscuits implements Biscuits {@Overridepublic void rounded() {System.out.println("新鲜出炉 圆乎乎的烧饼呀,圆乎乎");}}package BiscuitsDemo;
/*** 烧饼装饰抽象类* @author **/
public abstract class DecoratorBiscuits implements Biscuits{Biscuits biscuits;        //定义烧饼接口对象,通过带参构造方法封装烧饼接口对象public DecoratorBiscuits(Biscuits biscuits) {this.biscuits = biscuits;}
}package BiscuitsDemo;
/*** 添加了花瓣轮廓的烧饼烧饼类* @author **/
public class PetaloidBiscuits extends DecoratorBiscuits{public PetaloidBiscuits(Biscuits biscuits) {super(biscuits);}@Overridepublic void rounded() {//调用实际干活对象的rounded()方法biscuits.rounded();petaloid();    //添加花瓣轮廓,扩展功能}//花瓣轮廓private void petaloid() {System.out.println("像花一样的烧饼来咯");}
}

运行结果:

最后ps:

1.接口(统一规范):

  • 1.使设计、实现完全分离

  • 2、更加自然地使用多态

  • 3.更容易搭建程序的框架,更容易替换实现

2.继承:[也叫扩充](is-a 的关系)

  • (公共内容,放在父类)提高代码重用性,

  • (方便修改)提高维护性

  • 类与类之间有了关系,多态的前提

3.重写,方法重写又称[方法覆盖]:子类重写父类的方法。

重写好处:重写实现类的扩充,子类拥有了一种选择权:继承父类的方法实现细节,或者自己重写方法实现细节覆盖原有的方法的细节。(如果实例化子类对象,则调用的方法是子类重写的方法。)

当子类可继承父类,子类便拥有了父类的属性和方法,就不用再编写同样的方法,但是想拥有自己的实现方式,就需要重写覆盖继承来自父类的方法。

参考资料:https://www.imooc.com/article/24027 (Java设计模式(9)----------装饰器模式)

为什么不通过修改接口或者选择书写继承接口重写方法的新子类,偏偏选择添加上一个装饰器 (装饰类的作用)【java基础-----装饰器】相关推荐

  1. 51自学网-Java基础视频教程-笔记 最后修改于2020/9/9

    Java基础视频教程笔记 简介 正文 ==JVM Java Virtual Machine== 栈区 Stack Segment 堆区 Heap Segment 静态区 Data Segment 代码 ...

  2. Java 基础巩固:再谈抽象类和接口

    文章出自:安卓进阶学习指南 主要贡献者: Milo Struggle shixinzhang 读完本文你将了解: 背景介绍 什么是抽象类和接口 特点与区别 抽象类的特点 接口的特点 栗子 小结 如何选 ...

  3. 【Java基础系列教程】第八章 Java面向对象详解(三)_抽象类、接口、内部类、深拷贝与浅拷贝

    一.JavaBean规范 1.1 什么是JavaBean JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中.特点是可序列化,提供无参构造器,提供getter方法和 ...

  4. Java基础23-集合类2(Set接口,Iterator迭代器)

    一.Set接口简介 根据API,Set接口是一个不包含重复元素的 collection.更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null ...

  5. 菜鸟学习笔记:Java基础篇5(抽象类与接口、回调函数、内部类)

    菜鸟学习笔记:Java面向对象篇下 抽象类 接口 回调函数 内部类 成员内部类 匿名内部类 抽象类 通过前面知识的学习,抽象类这个概念应该不难理解,但比较容易和后面要说的接口混淆,而且在面试中也比较爱 ...

  6. Java基础-面向接口(interface)编程

    Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的&q ...

  7. C#OOP之八 继承 接口和抽象类

    视频课:  C#程序设计与宿舍管理系统实战-c#宿舍管理系统,c#管理系统-C#视频教程- 继承 在现实生活中有所谓的"种瓜得瓜.种豆得豆"的说法,在生物学概念上就是"遗 ...

  8. java继承和接口的区别_继承和实现接口的区别

    1,java类可以一次继承多个接口,用implements 接口1,接口2 2,如果是接口继承接口的话也可以用extends,接口是多继承的,java类才是单继承 3,接口继承接口可以不实现父接口中的 ...

  9. java的标记接口_Java中的标记接口?

    我被教授,Java中的Marker接口是一个空接口,用于向编译器或JVM发送信号,实现此接口的类的对象必须以特殊方式处理,如序列化,克隆等. 但最近我了解到,它实际上与编译器或JVM无关.例如,在Se ...

最新文章

  1. Knative 入门系列1:knative 概述
  2. 共克时艰:科技助力湖北地区银行业务线上转型
  3. 教你使用TensorFlow2对阿拉伯语手写字符数据集进行识别
  4. IOCP 浅析与实例
  5. 设计爬虫Hawk背后的故事
  6. 安卓seekbar 怎么判断正负_如果没有万用表,我们要怎么区分电源DC线的正负极呢...
  7. Memcached FAQ(2) 集群架构方面的问题
  8. POJ2135:Farm Tour
  9. [转载] vim风格设置
  10. Hadoop入门(七)——Hadoop安装(图文详解步骤2021)
  11. 如何解决谷歌浏览器插件屏蔽问题
  12. Linux磁盘NFC格式,kali linux 支持哪些nfc读卡器
  13. Java单例模式的双if
  14. 安卓基于JCVideoPlayer 播放视频(本地网络),基于java计数器实现视频轮播
  15. 黑帽SEO网站优化常用的14种技巧
  16. C/C++《数据结构课程设计》任务书[2022-12-27]
  17. Transact使用
  18. ABAP ALV红绿黄灯5步
  19. URL锚点HTML定位技术机制、应用与问题
  20. 【Android】RecyclerView的好伴侣:详解DiffUtil

热门文章

  1. windows快捷键自定义_在Windows中创建自定义Windows键盘快捷键
  2. android 画布 透明,Android透明画布(surfaceview)
  3. [C#]滑动拼图验证码
  4. 使用 Linux 工具进行计算机取证
  5. tomcat配置输出日志
  6. Study JQuery《zTree自动点击第一个节点》
  7. 关于在项目中有没有必要使用docker的一点感悟
  8. 常用Linux的国内源
  9. js获取英文名字的首字母
  10. 脚本之家未授权转载我的文章,希望大家帮忙举报一波。谢谢大家