Java设计模式之装饰模式是什么及怎么实现

Java设计模式之装饰模式是什么及怎么实现

1.什么是装饰模式

当我们想要改进或增强某个对象的功能,而又不想继承该类创建子类,可以考虑使用装饰模式。

使用装饰模式增强对象的某个功能,比生成子类再增强,更为灵活。

2.如何实现

1)抽象组件:定义一个抽象类,该抽象类定义了“被装饰者”需要被“装饰的方法”

2)具体组件:抽象组件的一个子类。成为“被装饰类”

3)装饰组件:也是抽象组件的一个子类。该类中持有“被装饰者”的引用,用来调用被装饰者的方法。可以为抽象类,也可以是非抽象类。

4)具体装饰类:是装饰组件的一个子类,被称为“装饰者”

3.代码实现

1)抽象组件

/** * 抽象组件,定义了被装饰类需要装饰的方法 */public abstract class ICake {    /**     * 需要装饰的方法     * @return     */    public abstract int getPrice();}

2)被装饰者

/** * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法 */public class Cake extends ICake {    /**     * 被装饰类中,装饰方法的基本实现     * @return     */    @Override    public int getPrice() {        System.out.println("getPrice");       return 100;    }}

3)装饰类

/** * 装饰类,也是抽象组件的一个子类。 * 可以是抽象类,也可以是非抽象类。 */public abstract class CakeDecorator extends ICake {    /**     * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。     */    ICake cake;    public CakeDecorator(ICake cake){        this.cake = cake;    }}

4)具体装饰

/** * 具体装饰类 */public class BlueBerryCake extends CakeDecorator {    public BlueBerryCake(ICake cake) {        super(cake);    }    /**     * 被装饰的方法     * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法     * @return     */    @Override    public float getPrice(){        return cake.getPrice()+elsePrice();    }    /**     * 增强的方法     * @return     */    private float elsePrice(){        System.out.println("else getPrice");        return 50;    }}

5)测试类

public class TestDecorator {    public static void main(String args[]){        ICake cake = new Cake();        CakeDecorator decorater = new BlueBerryCake(cake);        float price = decorater.getPrice();        System.out.println(price);    }}

4.拓展

1)利用子类继承也能实现某个方法的增强。相比通过装饰模式实现,装饰模式有和优势?

被装饰者和装饰者是松耦合关系。装饰类仅仅依赖于抽象组件,装饰类只需要知道被装饰类是抽象组件的一个子类,而不必知道具体是哪个子类。

装饰模式满足“开-闭原则”,不必修改具体组件,就可以增加针对该组件的装饰类。

5.JavaIo与装饰模式

java.IO包中的很多类使用了装饰模式。

Reader

FileReader

BufferdReader

以上就是关于“Java设计模式之装饰模式是什么及怎么实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

文章标题:Java设计模式之装饰模式是什么及怎么实现,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/21234

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年8月29日 下午11:46
下一篇 2022年8月29日

相关推荐

  • ae预合成快捷键是什么

    ae预合成快捷键: 答:ae预合成快捷键为:ctrl+shift+c。 当用户需要将两个素菜合成一个的时候,需要选这两个,然后直接合成。 ae预合成快捷键操作方法: 1、首先使用快捷键“ctrl+左键”来选择你要合成的素材,然后右击选“预合成”。 2、进入合成界面之后,可以为其创建一个名称。 3、搞…

    2022年8月29日
    3.3K00
  • echarts如何改变图表的颜色

    echarts改变图表颜色的方法 1、 打开编辑器新建study.html,并在头部引入echarts插件 2、在body区域新建一个div,并给div设置宽和高,用来生成柱状图 3、在script标签中加入柱状图相关代码 4、通过设置itemStyle下的color属性来改变柱状图颜色 5、完成之…

    2022年9月26日
    1.1K00
  • html5中使用哪个标签嵌入音频

    在html5中,可以使用audio标签嵌入音频;该标签的作用就是定义声音,比如音乐或者其他声音流,并且该标签仅支持MP3、Wav和Ogg三种声音格式,语法为“<audio src=”音频文件”>”。”。 本教程操作环境:windows10系统、html5版本、De…

    2022年9月15日
    72600
  • 网络协作软件有哪些

    网络协作软件有:1、BoardMix,一款轻量级的数字化多人在线实时协作软件;2、Pixso,是一款设计交付一体化协作工具软件;3、石墨文档,是一款可多人实时协作的云端offce;4、金山文档,是一款可多人实时协作的云端offce;5、Worktile,是以任务或项目管理为中心的一款协作平台;6、T…

    2022年9月13日
    1.1K00
  • usmt.ppkg文件有什么作用

    “usmt.ppkg”是windows自带的系统还原功能的系统备份文件;Windows系统还原是在不需要重新安装操作系统,也不会破坏数据文件的前提下使系统回到原有的工作状态,PBR恢复功能的备份文件就是“usmt.ppkg”。 本教程操作环境:windows10系统、DELL G3电脑。 usmt.…

    2022年9月10日
    5.1K00
  • dint数据类型的含义是什么

    dint是带符号位的32位整数类型;dint的表示方法及范围是“L#-2147483648~L#+2147483647”,定义为双整数或长整数,字节是电脑里的数据量单位,在计算机中,数据只用0和1这种表现形式。 本教程操作环境:windows10系统、DELL G3电脑。 dint是什么数据类型 D…

    2022年9月6日
    1.8K00
  • mysql的case when如何用

    在mysql中,“case when”用于计算条件列表并返回多个可能结果表达式之一;“case when”具有两种语法格式:1、简单函数“CASE[col_name]WHEN[value1]THEN[result1]…ELSE[default]END”;2、搜索函数“CASE WHEN[expr]T…

    2022年9月6日
    1.1K00
  • Oracle中for循环如何使用

    Oracle for in loop 循环的一些实例,以作学习和加强使用熟练度及场景应用. 一些技巧 for 语句后面的 loop end loop 可以类比成 c#/java 等编程语言 for 语句后面的语句块符号(花括号{}), 以便理解和使用. 一些实例 循环输出数值 — 循环输出数值be…

    2022年8月29日
    61800
  • imazing下载应用出错如何解决

    imazing下载应用出错解决方法 1、下载应用出错,有可能是imazing软件问题,可以在本站下载一个imazing进行尝试。 2、还可能是因为需要下载的软件问题,例如需要下载的软件依旧下架就无法正常下载了。 3、也可能是因为我们没有使用正确的应用下载方法,或者没有在App Store中获取过,下…

    2022年9月15日
    80400
  • windows浩辰cad看图王图片怎么放大

    浩辰cad看图王图片放大步骤: 一、按钮调整。 1、打开对应的文件。 2、找到如图位置的放大镜按钮。 3、选择需要使用的放大/缩小。 二、鼠标调整。 按住你的键盘ctrl,同时滑动鼠标的滚轮,向上是放大,向下是缩小。 到此,关于“windows浩辰cad看图王图片怎么放大”的学习就结束了,希望能够解…

    2022年9月21日
    79500
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部