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