より厳密なオブジェクト指向アプローチに従って、クラス TreeSet および HashMap のデコレータを作成できます。次に、show(object) を呼び出す代わりに、object.show() を呼び出します。これはよりクリーンな IMHO であり、カプセル化や抽象化などの OOP 原則に従います。
public interface Showable {
void show();
}
public class ShowableTreeSet<E> extends TreeSet<E> implements Showable
{
private TreeSet<E> delegate;
public ShowableTreeSet(TreeSet<E> delegate) {
this.delegate = delegate;
}
public void show() {
for (E e : delegate) {
System.out.println(e);
}
}
public boolean add(E e) {
return delegate.add(e);
}
//all other delegate methods
}
public class ShowableHashMap<K, V> extends HashMap<K, V> implements Showable
{
private HashMap<K, V> delegate;
public ShowableHashMap(HashMap<K, V> delegate) {
this.delegate = delegate;
}
public void show(){
Iterator<K> iterator = delegate.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
String value = delegate.get(key).toString();
System.out.println(key + " " + value);
}
}
public int size() {
return delegate.size();
}
//all other delegate methods
}
したがって、使用する実際のオブジェクトの周りに showable をラップする必要があります。
ShowableTreeSet<String> sts = new ShowableTreeSet<String>(new TreeSet<String>());
sts.show();
または、印刷用の Showable だけが必要な場合は、次のようにします。
Showable showable = new ShowableTreeSet<String>(new TreeSet<String>());
showable.show();
これらのデコレーターを、Iterable、List、Collection など、ほぼすべてのものに作成してから、依存性注入を使用して、たまたま使用する Collection (Iterable、List...) の実装を使用できます。