design pattern reloaded

本文详细解析了Singleton模式的实现方式,并介绍了如何通过依赖注入来解决数据库调用的mock问题。此外,还讨论了如何使用接口和配置控制来改进代码的可维护性和可测试性。同时,文章涉及了Visitor模式的应用,展示了如何通过递归遍历文档结构并进行美化打印。本文旨在提供关于设计模式、依赖管理以及文档处理的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

转载于:https://www.cnblogs.com/grep/archive/2012/07/15/2592335.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值