design pattern reloaded
Singleton
public final class Singleton{ private static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton instance(){ return INSTANCE; } public Object read(){ //nasty database call } }
test :(
public class TestVictim{ public void testSomething(){ //holy crap, how do I mock the database call in Singleton? } }
interface to rescue
public interface Singleton{ Object read(); } public class SingletonImpl implements Singleton{ public Object read(){ //... } } //dependency injection, you are my hero. public class Victim{ public final Singleton singleton; public Victim(Singleton singleton){ this.singleton = singleton; } public void doSomething(){ Object foo = singleton.read(); } }
learned:
interface and dependency injection
control by configuration
Visitor
public static boolean traverse_tree(BundleIContentTraverserVisitor visitor, IDocFrameworkSimpleNode n) { if (n == null) return false; if (!visitor.visitStart(n)) { return false; } for (IDocFrameworkSimpleNode sn: n.getSubnodes()) { traverse_tree(visitor, sn); } if (!visitor.visitEnd(n)) { return false; } return true; } public void prettyPrint(final StringWriter sw) { traverse(new BundleIContentTraverserVisitor() { int m_indentation_level = 0; private void printIndent() { if (m_indentation_level <= 0) return; for (int i=0; i < m_indentation_level; i++) { sw.write(" "); } } public boolean visitEnd(IDocFrameworkSimpleNode n) { m_indentation_level--; if (!(n instanceof TextNode)) { printIndent(); sw.write("</"+n.getName()+">\n"); } return true; } public boolean visitStart(IDocFrameworkSimpleNode n) { printIndent(); m_indentation_level++; if (n instanceof TextNode) { sw.write(n.getText()); sw.write("\n"); } else { sw.write("<"+n.getName()); for (Map.Entry<String,String> me: n.getAttributes().entrySet()) { sw.write(" "+me.getKey()+"=\""+me.getValue()+"\""); } sw.write(">\n"); } return true; } }); }