结构型模式之装饰者模式

GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq

一.定义

 装饰者模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。 

二、模式结构成员构成

? Component: 抽象构件

? ConcreteComponent: 具体构件

? Decorator: 抽象装饰类

? ConcreteDecorator: 具体装饰类

三.代码示例

 1 /**
 2  * Component
 3  * 抽象构件
 4  */
 5 public interface Person {
 6
 7     void eat();
 8 }
 9
10 /**
11  * ConcreteComponent
12  * 具体构件
13  */
14 public class Man implements Person {
15
16     @Override
17     public void eat() {
18         System.out.println("男人在吃");
19     }
20 }
21
22 /**
23  * Decorator
24  * 抽象装饰类
25  */
26 public abstract class Decorator implements Person {
27
28     protected Person person;
29
30     public void setPerson(Person person) {
31         this.person = person;
32     }
33
34     @Override
35     public void eat() {
36         person.eat();
37     }
38 }
39
40 /**
41  * ConcreteDectrator
42  * 具体装饰类
43  */
44 public class ManDecoratorA extends Decorator {
45
46     @Override
47     public void eat() {
48         super.eat();
49         reEat();
50         System.out.println("ManDecoratorA类");
51     }
52
53     public void reEat() {
54         System.out.println("再吃一顿饭");
55     }
56 }
57
58
59 /**
60  * ConcreteDectrator
61  * 具体装饰类
62  */
63 public class ManDecoratorB extends Decorator {
64
65     @Override
66     public void eat() {
67         super.eat();
68         System.out.println("===============");
69         System.out.println("ManDecoratorB类");
70     }
71 }
72
73
74 /**
75  * client
76  */
77 public class Client {
78
79     public static void main(String[] args) {
80         Man man = new Man();
81         ManDecoratorA md1 = new ManDecoratorA();
82         ManDecoratorB md2 = new ManDecoratorB();
83
84         md1.setPerson(man);
85         md2.setPerson(md1);
86         md2.eat();
87     }
88 }

四.优点和缺点分析

优点:

>装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
>通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。比如:Java中的IO流
>具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”

缺点:

>使用装饰模式进行系统设计时将产生很多小对象,这些装饰类和小对象的产生将增加系统的复杂度,加大学习与理解的难度。

五.应用场景

>需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。

>当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类).

原文地址:https://www.cnblogs.com/756623607-zhang/p/9222370.html

时间: 2024-12-25 07:15:34

结构型模式之装饰者模式的相关文章

设计模式系列二结构型之(装饰者模式)

1.装饰者模式简介 意图: 动态地给一个对象添加一些额外的职责. 适用性: 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 处理那些可以撤消的职责. 当不能采用生成子类的方法进行扩充时.一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类. 2.生活实例 3.装饰者模式结构 4.示意代码 // "Component" abstract class Component {

Java进阶篇设计模式之五-----外观模式和装饰器模式

前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 简单的来说就是对外提供一个简单接口,隐藏实现的逻辑.比如常用电脑的电源键,我们只需按电源键,就可以让它启动或者关闭,无需知道它是怎么启动的(启动CPU.启动内存.启动硬盘),怎么关闭的(关闭硬盘.关闭内存.关闭CPU)

IOS设计模式之二(门面模式,装饰器模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 门面(Facade)模式(译者注:facade有些书籍译为门面,有些书籍译为外观,此处译为门面) 门面模式针对复杂的子系统提供了单一的接口,不需要暴漏一些列的类和API给用户,你仅仅暴漏一个简单统一的API. 下面的图解释了这个概念: 这个API的使用者

代理模式与装饰器模式的区别

代理模式与装饰器模式的区别,主要大于,从使用者(客户端)的角度来看的: //装饰器的客户public class Client{ public static void main(String[] args){ //客户指定了装饰者需要装饰的是哪一个类 Component component = new Decorator(new ConcreteComponent()); - }}//代理的客户public class Client{ public static void main(String

设计模式回顾:策略模式、代理模式、装饰者模式的区别

前言 设计模式有很多,但设计模式的目的是一致的,都是为了提升代码的可读性和可扩展性.设计模式都遵循一些基本的原则,设计模式是为了遵循这些原则而创造的工具. - 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因.这一点是说,如果有一些类过于臃肿,承担了过多的职责,就应当分解他. - 开放-封闭原则:软件实体(类.模块.函数等)应该可以扩展,但是不可修改.这一点是说,拒绝硬编码,拒绝直接修改原有代码. - 依赖倒转原则:高层模块不应该以来低层模块.两个都应该以来抽象.抽象不应该依赖细节.细节

【设计者模式】装饰者模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类. 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个

设计模式——代理模式与装饰器模式

代理模式 解决的问题:在直接访问对象时带来很大的开销.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层. 代理模式就相当于Windows 里面的快捷方式,它并不实现什么功能,而只是在中间加以控制:而装饰器模式为了增强功能. Java中的典型示例:静态代理:hibernate中的session.load()方法:动态代理:SpringAOP 代码

spring 十三种模式之 -- 装饰器模式

解释:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 装饰器模式的最主要的功能 1.扩展一个类的功能. 2.动态增加功能,动态撤销. 步骤1. 创建一个接口: public interface Train { public void run2(); } 步骤2.实现接口的实体类 pu

Java 代理模式和装饰者模式的区别

装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案:代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用: 装饰模式应该为所装饰的对象增强功能:代理模式对代理的对象施加控制,并不提供对象本身的增强功能 二者的实现机制确实是一样的,可以看到他们的实例代码重复是很多的.但就语义上说,这两者的功能是相反的,模式的一个重要作用是简化其他程序员对你程序的理解, 你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制, 虽然代码很可能相同,但如果你