如何重构此模板方法实现

时间:2015-01-22 01:29:31

标签: design-patterns refactoring

我有一个混蛋模板方法实现。它不是具有子类实现的基类,而是一个util类上的静态方法,它接受它所委托的接口。我想将其重构为更常见的模式,以便我可以停止传递Domain类。

我认为第一步是将模板转换为对象方法,但是我对如何将我的5个Helper实现(未显示)移动到新Template对象的子类中感到茫然。

public interface Helper
{
    void doFirstThing(Domain d);
    void doSecondThing(String id);
}

public class UtilClass
{
    public static void  template(Domain d,  Helper h, String who)
    {
        //begin database transaction
        try
        {
            //some logic
            h.doFirstThing(d);
            //more computation

            h.doSecondThing(d.getId());
            //database commit();
        }
        finally
        {
            //if transaction open database rollback();
        }
    }
}

public class Domain
{

    public String getId()
    {
        return "value";
    }

}

2 个答案:

答案 0 :(得分:0)

如下所示...

public abstract class TemplateX
    {
        protected Domain _domain;

        protected TemplateX(Domain domain)
        {
            _domain = domain;
        }
        protected abstract void DoFirstThing();
        protected abstract void DoSecondThing();

        public void DoIt(string who)
        {

            //begin database transaction
            try
            {
                //some logic
                DoFirstThing();
                //more computation

                DoSecondThing();
                //database commit();
            }
            finally
            {
                //if transaction open database rollback();
            }
        }
    }

    public class Implementation1 : TemplateX
    {
        public Implementation1(Domain domain) : base(domain)
        {

        }

        protected override void DoFirstThing()
        {
            //code from helper class here
        }

        protected override void DoSecondThing()
        {
            //code from helper class here
        }
    }

答案 1 :(得分:0)

我想了一些,然后提出了以下步骤。

  1. 用方法对象替换方法。将帮助程序保留在构造函数参数之外。我还跳过了关于创建局部变量字段的部分。当我想要它完成时,自动重构就能做到这一点。
  2. 内联静态方法。
  3. 使实现成为新MethodObject的子类。 这涉及添加/修改/构造函数。
  4. 使用实现创建和调用方法对象时,只需创建实现并调用模板方法。

    新的MethodObject(d,who).template(new Implementation(d,who));

  5. 成为

    Implementation impl = new Implementation(d, who);
    impl.template(impl);
    
    1. 对其他实施重复步骤3和4.
    2. 使MethodObject / Baseclass成为抽象,并将接口中的方法作为抽象方法添加。
    3. 更新MethodObject / Baseclass以使用抽象方法。
    4. 删除Helper界面作为参数,因为它没有被使用。
    5. 从子类中删除接口声明。
    6. 删除帮助程序界面。
    7. 可以删除以前在接口上定义的方法的参数,这些方法是父类中的字段。 这可以扩展到从字段获得的值。由于d是一个字段,因此不需要传递d.getId()。         doSecondThing(d.getId());