我们来说一下装饰模式。
一、什么是装饰模式
装饰模式也叫包装模式,使用它可以给指定对象增强原有功能,用于扩展原有功能。相比于子类继承,装饰模式提供了更好的灵活性。而对于使用者来说,这个过程是透明的,调用方式没有发生变化。
二、装饰模式的结构图
从结构图我们可以看到,在装饰模式中存在的角色:
- 抽象组件角色(Component):在抽象组件接口类中,抽象出要增强的功能接口。
- 具体组件角色(ConcreteComponent):实际就是被装饰者对象类,实现了抽象组件接口,用来定义一个实实在在的对象,给此对象进行功能增强。
- 装饰角色父类(Decorator):在装饰角色父类中,持有抽象组件角色的对象,实现了抽象组件角色接口,这样,当抽象组件进行实例化的时候,可以明确知道要给哪个对象增加职责。这么做的目的是为了实现扩展和可复用,并且对于被装饰者对象而言,这个过程是透明的。
- 具体装饰类角色(ConcreteDecorator):定义具体的装饰行为实现。
三、用法举例
我们举一例,比如,西游记中,孙大圣为了降伏妖怪,迫不得已的时候需要利用72般变化。72般变化为增强降伏妖怪的过程变得生动精彩。我们的孙大圣是什么?一只猴子。我们先来画类图:
1、我们先定义大圣打妖怪这个接口类。
package com.zhaodf.pattern.decoratorPattern; public interface PlayDevil{ void playTheDevil(); }
2、定义大圣本尊
package com.zhaodf.pattern.decoratorPattern; public class Sunstory implements PlayDevil{ public void playTheDevil() { System.out.println("孙大圣打妖怪"); } }
3、定义装饰类:孙大圣要变化
package com.zhaodf.pattern.decoratorPattern; public class MythChange implements PlayDevil{ private PlayDevil playDevil; public MythChange(PlayDevil playDevil){ this.playDevil = playDevil; } public void playTheDevil() { playDevil.playTheDevil(); } }
4、定义具体装饰类角色
大圣变蜜蜂:
package com.zhaodf.pattern.decoratorPattern; public class MythChangeToBee extends MythChange{ public MythChangeToBee(PlayDevil playDevil) { super(playDevil); } @Override public void playTheDevil() { System.out.println("孙大圣变成了蜜蜂"); } }
大圣变小鱼:
package com.zhaodf.pattern.decoratorPattern; public class MythChangeToFish extends MythChange{ public MythChangeToFish(PlayDevil playDevil) { super(playDevil); } @Override public void playTheDevil() { System.out.println("孙大圣变成了鱼儿"); } }
5、客户端类
package com.zhaodf.pattern.decoratorPattern; public class TestDecorator { public static void main(String[] args){ PlayDevil playDevil = new Sunstory(); PlayDevil playDevilToFish = new MythChangeToBee(playDevil); playDevilToFish.playTheDevil(); } }
运行结果:
四、装饰者模式在Java IO中的使用
装饰者模式是Java I/O库的基本模式。我们看下IO库的设计类图:
Java I/O库提供了多种功能的文件读取解析组合,如果这些类都是用继承的方法实现的,那么每一种组合都需要一个类,这样就会造成大量重复功能类的出现。而设计者采用装饰者模式,这么做就大大减少了功能重复类的出现。
根据类图中我们可以看到:
- 抽象组件角色(Component):由InputStream扮演。这是一个抽象类,为各种子类型提供统一的接口。
- 具体组件角色(ConcreteComponent):由ByteArrayInputStream、FileInputStream、PipedInputStream、StringBufferInputStream等类扮演。它们实现了抽象构件角色所规定的接口。
- 装饰角色父类(Decorator):由FilterInputStream扮演。它实现了InputStream所规定的接口。
- 具体装饰类角色(ConcreteDecorator):由几个类扮演,分别是BufferedInputStream、DataInputStream以及两个不常用到的类LineNumberInputStream、PushbackInputStream。
相关推荐
### Java设计模式详解 #### 创建型模式 **1.1 工厂方法(Factory Method)** 工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下...
下面,我们将深入探讨几个重要的Java设计模式。 1. 单例模式:单例模式确保一个类只有一个实例,并提供全局访问点。在Java中,有多种实现单例的方法,如饿汉式(静态常量)、懒汉式(线程不安全)、双重检查锁定...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
Java设计模式详解合集是一份宝贵的资源,包含了丰富的面向对象设计原则和多种设计模式的深入讲解。这份资料旨在帮助开发者提升软件设计能力,遵循良好的编程实践,提高代码的可读性、可维护性和复用性。以下是其中...
在Java编程中,有23种经典的GoF(Gang of Four)设计模式,它们被分为三大类:创建型、结构型和行为型。本资源集合了这些模式的详细解释与源码分析,旨在帮助开发者深入理解和应用设计模式。 1. 创建型模式...
Java中的23种设计模式是软件工程中非常重要的概念,它们是解决常见编程问题的成熟解决方案,被广泛应用于各种复杂的软件系统中。这些模式在不同的上下文中提供了可重用的结构和行为,使得代码更加清晰、可维护和扩展...
Java设计模式是一种在特定场景下解决软件设计问题的方法论。设计模式能够帮助开发者在面对复杂问题时,更有效地组织代码、提高程序的可维护性和可扩展性。根据不同的应用场景,设计模式被分为三大类:创建型模式、...
内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...
### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...
" JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...
在Java中,"JAVA设计模式.mobi"这本书可能涵盖了如下设计模式的详细讲解: 1. 单例模式:保证一个类只有一个实例,并提供全局访问点。在Java中,有多种实现单例的方式,包括饿汉式、懒汉式、双重检查锁定(Double-...
Java设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 设计模式的六大原则 1. 开闭原则...
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板或蓝图。...在"java24种设计模式详解"这个资源中,你会找到每种模式的详细讲解和实例,这将有助于你深入理解并掌握它们。
Java 中 23 种设计模式详解 在软件设计中,设计模式是解决特定问题的通用解决方案。 Java 中有 23 种常见的设计模式,下面将对每种设计模式进行详细的解释: 1. 抽象工厂模式(Abstract Factory) 抽象工厂模式...
《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...
以下是对给定文件中提到的几种Java设计模式的详细解析。 #### 1. 单例模式 (Singleton Pattern) 单例模式是一种常用的对象创建型模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。实现单例模式的关键...
Java是一种广泛使用的面向对象的编程语言,而设计模式则是软件工程中解决常见问题的经验总结,是程序员在实践中形成的最佳实践。这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心...
### Java设计模式选择题复习知识点详解 #### 工厂系列模式的优缺点 - **优点**: - **解耦**:工厂模式的核心优势之一在于它让用户代码与具体产品的实现相分离,使得用户无需了解产品是如何创建的,只需要知道...
以下是对标题"Java设计模式相关书籍"及描述"设计模式之禅 深入浅出"中所包含的关键知识点的详细阐述。 1. **设计模式的分类** 设计模式通常分为三大类:创建型模式(Creational Patterns)、结构型模式...
在Java编程中,有23种经典的设计模式,它们是面向对象设计的核心部分,帮助我们编写可维护、可扩展且高效的应用程序。以下是这23种设计模式的概述,结合代码实例进行详细说明。 1. **单例模式(Singleton)**:确保...