当我回顾许多有关“ Decorator”设计模式的示例时,我只是想出了一些示例,这些示例主要是关于更改始终返回字符串的方法或汇总数字的cost()之类的方法。
这真的是Decorator设计模式的唯一用法吗?
为什么我看不到这种设计模式的真实样本或用例。
我所知道的全部用于Java IO API。
但是我还要打印文本。 真实的东西。我进行了很多搜索,但是找不到合适的样本。
答案 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