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;
            }
        });
    }

 

 

posted on 2012-07-15 14:56  grep  阅读(160)  评论(0编辑  收藏  举报