Java中的装饰器模式(Decorator)

本文深入探讨了Java中的装饰器模式,它是一种替代继承以实现对象功能扩展的技术。通过实例分析了如何使用装饰器模式解决Stack数据结构的多种拓展需求,避免了继承导致的组合爆炸和代码重复问题。文中详细介绍了装饰器模式的定义、类图以及代码实现,展示了如何通过装饰器动态组合特性,实现高度灵活和定制化的对象延展。
摘要由CSDN通过智能技术生成

目录

1 前言

2 装饰器模式简介

2.1 定义

2.2 模式类图

3 样例说明

3.1 样例

3.2 样例分析

3.3 代码实现


1 前言

Java中面向可复用性和可维护性的设计模式大体上分为三类:创建型模式(Creational patterns)、结构型模式(Structural patterns)、行为类模式(Behavioral patterns),本文将主要介绍结构型模式中的装饰器模式(Decorator pattern)。

 

2 装饰器模式简介

2.1 定义

一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

2.2 模式类图

装饰器模式的模式关系图可由下图来说明:

 

3 样例说明

3.1 样例

假设你有多种Stack数据结构的拓展,具体包括以下三个子类:

UndoStack一个让你撤销上一步push或pop操作的Stack
SecureStacck一个需要密码的Stack
SynchronizedStack一个序列化并发访问的Stack

 

此时需要有特性的任意组合,例如SecureUndoStack, SynchronizedUndoStack, SecureSynchronizedStack, SecureSynchronizedUndoStack,那我们应该如何来实现呢?

3.2 样例分析

如果此时我们选择以继承来实现的话,则模式图由下图所示:

这会导致两个较大的问题:组合爆炸 和 大量代码重复 

而如果我们选择以装饰器模式来实现的话,则我们需要对每一个特性构造子类,通过委派机制增加到对象上,具体模式图如下:

此时,我们采用装饰器模式相较于静态的继承机制,我们就具有了更加灵活,可定制化的,紧密结合的延展了。

3.3 代码实现

The ArrayStack Class:

interface Stack{
    void push(Item e);
    Item pop();
}

public class ArrayStack implements Stack{
    ... //rep
    
    public ArrayStack() {...}
    public void push(Item e) {...}
    public Item pop() {...}
    
    ...
}

The AbstractStackDecorator Class:

public abstract class StackDecorator implements Stack {
    protected final Stack stack;
    public StackDecorator (Stack stack) {
        this.stack = stack;
    }
    public void push(Item e) {
        stack.push(e);
    }
    public Item pop() {
        return stack.pop();
    }
    
    ...
}  

The Concrete Decorator Classes:

public class UndoStack
        extends StackDecorator
        implements Stack {
    private final UndoLog log = new UndoLog();
    public UndoStack(Stack stack) {
        super(stack);
    }
    public void push(Item e) { 
        log.append(UndoLog.PUSH, e);
        super.push(e);
    }
    public void undo() {
        //implement decorator behaviors on stack
    }
    
    ...
}

这里我们需要注意的是super(stack) 和后面的 super.push(e),这里的super相当于是对装饰器中的方法的委派,而push方法中的log.append(UndoLog.PUSH, e)则是增加的新特性。

最后,我们使用decorator classes的方法如下:

//构造一个普通stack: 
Stack s = new ArrayStack();

//构造一个UndoStack: 
Stack t = new UndoStack(new ArrayStack());

//构造一个SecureSynchronizedUndoStack: 
Stack t = new SecureStack(
                  new SynchronizedStack(
                       new UndoStack(s)));

其中,值得注意的是最后构造具有多种特性的object时,我们需要通过一层一层的装饰来实现,其中具体机制如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值