面向对象设计:具有不同依赖关系的多态类?
Object oriented design: polymorphic classes with different dependencies?
我没有太多面向对象的编程和设计经验,所以请多多包涵。
我正在尝试创建一组多态 DataProcessor 类。 DataProcessor 有一组数据和一个处理方法。每个实现都可以以完全不同的方式处理数据。例如写入数据库、发送电子邮件、将数据发布到 API 等
我对如何正确处理所有这些不同(和未知)的依赖关系感到困惑。我可以将依赖项硬编码到每个实现中,我认为一切都应该可以正常工作,但是有更好的设计吗?
只要所有DataProcessor实现处理的是同一类型的数据,就可以使用hierarchy。
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) {
}
}
在实现中注入不同的依赖没有问题
更好的设计是在每个不同类型的构造函数中要求不同的依赖关系,并且只实现接口来提供通用的东西。
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();
}
}
对具有不同依赖项的每个 class 重复。
这使得每个 class 都可以自行测试,并允许您使用依赖倒置原则来提供依赖的实现。
如果每个处理器共享一些代码(即处理相同,只是传递机制不同),那么有一个基础 class 和通用代码,并且有一个抽象方法可以传递结果。然后每个不同的 class 可以实现抽象方法以不同的方式传递结果,使用不同的依赖项并且您不会重复处理逻辑。
我没有太多面向对象的编程和设计经验,所以请多多包涵。
我正在尝试创建一组多态 DataProcessor 类。 DataProcessor 有一组数据和一个处理方法。每个实现都可以以完全不同的方式处理数据。例如写入数据库、发送电子邮件、将数据发布到 API 等
我对如何正确处理所有这些不同(和未知)的依赖关系感到困惑。我可以将依赖项硬编码到每个实现中,我认为一切都应该可以正常工作,但是有更好的设计吗?
只要所有DataProcessor实现处理的是同一类型的数据,就可以使用hierarchy。
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) {
}
}
在实现中注入不同的依赖没有问题
更好的设计是在每个不同类型的构造函数中要求不同的依赖关系,并且只实现接口来提供通用的东西。
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();
}
}
对具有不同依赖项的每个 class 重复。
这使得每个 class 都可以自行测试,并允许您使用依赖倒置原则来提供依赖的实现。
如果每个处理器共享一些代码(即处理相同,只是传递机制不同),那么有一个基础 class 和通用代码,并且有一个抽象方法可以传递结果。然后每个不同的 class 可以实现抽象方法以不同的方式传递结果,使用不同的依赖项并且您不会重复处理逻辑。