当前位置:首页 > 服务端 > 设计模式——装饰模式详解

设计模式——装饰模式详解

2022年09月16日 23:01:20服务端4

0. 前言  

写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~本文原创,转载请注明出处为SEU_Calvin的博客

装饰模式是结构型设计模式之一,使用一种对客户透明的方式来动态拓展对象的功能,Java IO中各种流的嵌套就是装饰模式的很好体现。

 

1. 装饰模式介绍

装饰模式定义:

动态地给一个对象添加一些额外的功能,比生成子类要灵活。

 

装饰模式的使用场景:

需要透明且动态地拓展类的功能的场景。

 

装饰模式包括的角色:

 设计模式——装饰模式详解 _ JavaClub全栈架构师技术笔记

1)抽象组件Component类。

2)组件具体实现ConcreteComponent类。也是被装饰的对象

3)抽象装饰类Decorator内部持有一个组件对象的引用,职责就是装饰ConcreteComponent。之所以是抽象的,就是为了方便不同的装饰“风格”子类的自定义实现。

4)具体装饰类ConcreteDecorator

 

2.  装饰模式实例介绍

想到装饰,很容易想到一个人穿衣服,在不同的季节穿不同的衣服,比如夏天穿短裤、冬天穿毛裤,但是不管什么季节,内裤肯定是要穿的。

抽象组件Component类就可以是抽象类Person,而ConcreteComponent类就可以是具体的一个人Calvin,也是要被装饰的对象。抽象装饰类Decorator持有了Calvin的引用,并且回调了Calvin本身的一个“穿内裤”的行为,并且在具体的装饰类中,即“冬夏”两个类中,分别为主人公Calvin穿上了毛裤和短裤,为对象增加了额外的功能。代码也比较简单,如下所示。

/**
 * Decorator Pattern
 * Created by Calvin on 2017/5/10.
 */
public class Decorator {
    public static void main(String[] args) {
        Person calvin = new Calvin();
        PersonCloth summerCloth = new SummerCloth(calvin);
        PersonCloth winterCloth = new WinterCloth(calvin);
        summerCloth.dressed();
        winterCloth.dressed();
    }

    public static abstract class Person{
        public abstract void dressed();
    }

    public static class Calvin extends Person{
        @Override
        public void dressed() {
            System.out.println("穿件内裤");
        }
    }

    public static abstract class PersonCloth extends Person{
        Person myPerson;

        public PersonCloth(Person myPerson) {
            this.myPerson = myPerson;
        }

        @Override
        public void dressed() {
            myPerson.dressed();
        }
    }

    public static class SummerCloth extends PersonCloth{

        public SummerCloth(Person myPerson) {
            super(myPerson);
        }

        @Override
        public void dressed() {
            super.dressed();
            System.out.println("穿件短裤");
        }
    }

    public static class WinterCloth extends PersonCloth{

        public WinterCloth(Person myPerson) {
            super(myPerson);
        }

        @Override
        public void dressed() {
            super.dressed();
            System.out.println("穿件毛裤");
        }
    }
}

3.  装饰模式总结

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。

装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用

前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。

作者:SEU_Calvin
来源链接:https://blog.csdn.net/SEU_Calvin/article/details/71138079

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/42190.html

标签: 设计模式
分享给朋友:

“设计模式——装饰模式详解” 的相关文章

常用设计模式系列(六)—单例模式

常用设计模式系列(六)—单例模式

一、前言各位大佬好,由于本人的原因,拖更了几天休息了一下,吃了点好吃的,为了填饱自己的肚子,逛遍了天下美食(我所在这个城市的某个角落),所谓干饭人干饭魂,干饭人吃饭得用盆。吃饱喝足之后,活还是要干的,所以今天继续开始我们的设计模式,今天讲解设计模式之“单例模式”,单例模式算的上是在整个设计模式体系中...

关于设计模式

掌握设计模式并不是件很难的事情,关键在于多思考,多实践,不要听到人家说懂几个设计模式就很“牛”,只要用心学习,设计模式也就那么回事,你也可以很“牛”的,一定要有信心。 在学习每一个设计模式时至少应该掌握如下几点:这个设计模式的意图是什么,它...

炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象...

炒冷饭系列:设计模式 单例模式

炒冷饭系列:设计模式 单例模式

炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是单例模式...

java多线程12种设计模式

1、Single Threaded Execution Pattern(单线程执行模式) 2、Immutable Pattern(不可变模式) 3、Guarded Suspension Pattern(防卫暂停模式) 4、Balking Pattern(止步模式...

转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

原文:http://www.cnblogs.com/wang-meng/p/5898837.html 一:继承、抽象类与接口区别、访问控制(private, public, protected,默认)、多态相关!1、interface和 abstract class的区别inter...

SpringMVC的设计模式是什么?

SpringMVC的设计模式是什么?

SpringMVC设计模式是一种通用的软件编程思想。 在SpringMVC设计模式中认为, 任何软件都可以分为三部分组成: 1.控制程序流转的控制器(Controller) 2.封装数据处理数据的模型(Model) 3.负责展示数据的视图(view)...

《java编程思想》:设计模式(不定期更新)

1.策略设计模式   创建一个能够根据所传递的参数对象的不同而具有不同的方法,被称为策略设计模式。这类方法包含索要执行的算法中固定不变的部分,而“策略”包含变化的部分。策略就是传递进去的参数对象。在下面的代码示例中,Process对象就是策略。应用在了s上。 代码示例:...

Java 高并发第二阶段实战---高并发设计模式,内存模型,CPU一致性协议,volatile关键字剖析

     第二阶段的课程主要围绕着Volatile关键字,内存重排序,Happen-Before,Cpu一致性协议,高并发下的设计模式以及类加载器几个大的方面展开,下面是内容详细信息,本教程是本人录制,下载地址为 高并发设计模式 汪文...

单例设计模式线程安全问题

单例设计模式线程安全问题 懒汉式 class Lazy { private Lazy(){ System.out.println("test Lazy"); } private static Lazy lazy=null;...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。