Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 装饰设计模式用例_Design Patterns_Decorator - Fatal编程技术网

Design patterns 装饰设计模式用例

Design patterns 装饰设计模式用例,design-patterns,decorator,Design Patterns,Decorator,当我回顾了许多“Decorator”设计模式的示例时,我刚刚提出了一个示例,主要是关于更改一个总是返回字符串的方法,或者更改一个聚合数字的方法,如cost() 这真的是装饰设计模式的唯一用途吗 为什么我看不到这种设计模式的真实示例或用例 据我所知,它是用于javaioapi的 但是我想用其他的东西来打印文本。 一些真实的东西。我搜索了这么多,但找不到合适的示例。Decorator动态地为对象添加职责。假设我们需要计算一个项目添加到集合的次数(一种检测细节)。我们在java中有Set接口,我们可以

当我回顾了许多“Decorator”设计模式的示例时,我刚刚提出了一个示例,主要是关于更改一个总是返回字符串的方法,或者更改一个聚合数字的方法,如cost()

这真的是装饰设计模式的唯一用途吗

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

据我所知,它是用于javaioapi的

但是我想用其他的东西来打印文本。
一些真实的东西。我搜索了这么多,但找不到合适的示例。

Decorator动态地为对象添加职责。假设我们需要计算一个项目添加到
集合的次数(一种检测细节)。我们在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();
    }

}
公共类InstrumentedSet扩展了ForwardingSet{
私有int addCount=0;
公共仪表集(集合s){
超级(s);
}
@凌驾
公共布尔加法(E){
addCount++;
返回super.add(e);
}
@凌驾
公共布尔addAll(集合c){
返回s.containsAll(c);
}
@凌驾
公共布尔addAll(集合c){
返回s.Retainal(c);
}
@凌驾
公共布尔removeAll(集合c){
返回s.removeAll(c);
}
@凌驾
公共空间清除(){
s、 清除();
}
}
关于
Decorator
模式,还有更多的例子,您最好看看。例如,假设您正在开发基于窗口的GUI应用程序。您可能需要在窗口中添加边框、滚动条等。有时,您可能需要添加这些选项的任意组合。这是Gamma在著名的设计模式书[1]中提到的
装饰模式的一个很好的用法。我建议您阅读这本书[1],了解更多关于设计模式的信息

[1]

有玩具用例和更高级(横切关注点)的用例。