在我的情况下,我应该使用继承或组合吗?

时间:2014-12-02 01:29:40

标签: java inheritance design-patterns logging composition

我正在创建一个与另一个类共享公共代码的类,并且我不确定应该使用哪种模式。我已经上过课:

public class TeamA{
    private static final Logger LOGGER = Logger.getLogger(TeamA.class);

    @Autowired
    private Utility util; 

    public void proceedWithA(){
        // do something useful here
        updateProgress();
    }

    private void updateProgress(){
        LOGGER.info("Updating progress!");
        // do something to update the progress
    }
}

TeamB我创建的类与TeamA几乎完全相同,只是在proceedB()中它在调用updateProgress()之前做了不同的事情。

public class TeamB{
    private static final Logger LOGGER = Logger.getLogger(TeamB.class);

    @Autowired
    private Utility util;

    public void proceedWithB(){
        // do something useful here
        updateProgress();
    }

    private void updateProgress(){
        LOGGER.info("Updating progress!");
        // do something to update the progress
    }
}

所以起初我倾向于通过创建一个超类Team来继承使用继承,以便从它们扩展:

public class Team{
    // How should I define the Logger?

    @Autowired
    private Utility util;

    protected void updateProgress(){
        // LOGGER.info("Updating progress!");
        // do something to update the progress
    }
}

我应该如何使用记录器?在TeamA / B类中,它被定义为private static final,但显然我不能在超类中执行相同操作,因为我想分别为TeamA和TeamB提供记录器。

我也考虑过构图。但似乎我必须将Logger作为参数传递给updateProgress方法。这样可以或有更好的方法吗?

public class TeamA{
    private static final Logger LOGGER = Logger.getLogger(TeamA.class);

    @Autowired
    private Team teamUtil;

    public void proceedWithA(){
        // do something useful here
        teamUtil.updateProgress(LOGGER);
    }
}

public class Team{
    @Autowired
    private Utility util;

    protected void updateProgress(Logger LOGGER){
        LOGGER.info("Updating progress!");
        // do something to update the progress
    }
}

我是设计模式的新手,这个记录器让我感到困惑。有人可以给我一些建议吗?谢谢:))

2 个答案:

答案 0 :(得分:0)

public abstract class Team{
    protected abstract Logger getLogger();

    protected void updateProgress(){
        getLogger().info("Updating progress!");
        // do something to update the progress
    }
}

您的子课程现在可以实现getLogger以返回他们的static final Logger

答案 1 :(得分:0)

“protected void updateProgress”位置需要修复,因为它的功能随类更改。 你可以在这里做的是创建一个抽象的超类,并使updateProgress抽象(这是模板模式)。让基类为它提供独立的功能。通过这种方式,您可以通过子类/超类变量使用它。 没有法律你需要在每个地方使用组合,它取决于......在你的情况下你应该使用模板方法模式。