装饰器设计模式用例

时间:2018-08-03 10:21:46

标签: design-patterns decorator

当我回顾许多有关“ Decorator”设计模式的示例时,我只是想出了一些示例,这些示例主要是关于更改始终返回字符串的方法或汇总数字的cost()之类的方法。

这真的是Decorator设计模式的唯一用法吗?

为什么我看不到这种设计模式的真实样本或用例。

我所知道的全部用于Java IO API。

但是我还要打印文本。 真实的东西。我进行了很多搜索,但是找不到合适的样本。

1 个答案:

答案 0 :(得分:0)

装饰器动态添加对象的职责。假设我们需要计算将项目添加到Set中的次数(一种检测详细信息)。我们在Java中有Set接口,我们可以实现一个装饰器,将检测行为添加到现有的Set实现中,就像这样。

public class InstrumentedSet<E> extends ForwardingSet<E> {
    private int addCount = 0;

    public InstrumentedSet(Set<E> s) {
        super(s);
    }

    @Override
    public boolean add(E e) {
        addCount++;
        return super.add(e);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        addCount += c.size();
        return super.addAll(c);
    }

    public int getAddCount() {
        return addCount;
    }

}

public class ForwardingSet<E> implements Set<E> {
    private final Set<E> s;

    public ForwardingSet(Set<E> s) {
        super();
        this.s = s;
    }

    @Override
    public int size() {
        return s.size();
    }

    @Override
    public boolean isEmpty() {
        return s.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        return s.contains(o);
    }

    @Override
    public Iterator<E> iterator() {
        return s.iterator();
    }

    @Override
    public Object[] toArray() {
        return s.toArray();
    }

    @Override
    public <T> T[] toArray(T[] a) {
        return s.toArray(a);
    }

    @Override
    public boolean add(E e) {
        return s.add(e);
    }

    @Override
    public boolean remove(Object o) {
        return s.remove(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        return s.containsAll(c);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        return s.addAll(c);
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        return s.retainAll(c);
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        return s.removeAll(c);
    }

    @Override
    public void clear() {
        s.clear();
    }

}

还有更多Decorator模式的示例,您最好看看。例如,假设您正在开发基于Window的GUI应用程序。您可能需要在窗口,滚动条等上添加边框。有时您可能需要添加这些内容的任何组合。这是Decorator模式的良好用法,正如Gamma着名的《设计模式》一书[1]所述。我建议您阅读本书[1]以了解有关设计模式的更多信息。

[1] https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612