面向对象设计:具有不同依赖关系的多态类?

时间:2015-02-25 16:43:19

标签: dependency-injection polymorphism

我对面向对象编程和设计没有多少经验,所以请耐心等待。

我正在尝试创建一组多态DataProcessor类。 DataProcessor具有一组数据和一个处理方法。每个实现都可以以完全不同的方式处理数据。例如,写入数据库,发送电子邮件,将数据发布到API等等。

我对如何正确处理所有这些不同(和未知)的依赖关系感到困惑。我可以将依赖项硬编码到每个实现中,我认为一切都应该正常工作,但是有更好的设计吗?

2 个答案:

答案 0 :(得分:0)

如果所有DataProcessor实现都处理相同类型的数据,则可以使用层次结构。

public interface DataProcessor {
    public abstract void process(DataType data);
}

public class DatabaseDataProcessor implements DataProcessor {
    private MyDAO myDao;

    @Override
    public void process(DataType data) {

    }
}

public class EmailDataProcessor implements DataProcessor {
    private EmailSender sender;

    @Override
    public void process(DataType data) {

    }
}

在实现

中注入不同的依赖项没有问题

答案 1 :(得分:0)

更好的设计是要求每个不同类型的构造函数中的不同依赖项,并且只需实现接口以提供常见的东西。

public interface IDataProcessor 
{
     void ProcessData(SomeType data);
}

然后您的电子邮件实现就像这样

public EmailingDataProcessor : IDataProcessor
{    
     IEmailer emailer;

     EmailingDataProcessor(IEmailer emailer)
     {
          this.emailer = emailer;
     }

     public void ProcessData(SomeType data)
     {
         //do the processing
         emailer.EmailResults();
     }
}

对具有不同依赖关系的每个类重复。

这使得每个类本身都可以测试,并允许您使用依赖性反转主体来提供依赖项的实现。

如果每个处理器共享一些代码(即处理是相同的,它只是不同的传递机制,那么有一个带有公共代码的基类,并且有一个抽象方法可以提供结果。然后每个不同的类可以实现抽象方法以不同的方式传递结果,使用不同的依赖关系,并且不要复制处理逻辑。