Java教程

Java中的装饰器模式(Decorator)

本文主要是介绍Java中的装饰器模式(Decorator),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

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时,我们需要通过一层一层的装饰来实现,其中具体机制如下图:

这篇关于Java中的装饰器模式(Decorator)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!