我现在正在开发一个图像二值化库,在这个库中将实现经典的二值化方法,如 Sauvola 和 Otsu 方法。现在我的问题是如何优雅地设计图书馆。目前,我有两个解决方案:
解决方案1:
class Binarization
{
public:
BiinterfacePtr interface_;
enum BinarizationMethods
{
Method1, Method2, Method3, Method4
}
void set(BinarizationMethods method, Image *p_in, Image *p_out, Binarizationpara ¶)
{
if (method == Method1)
{
BiinterfacePtr interfacetemp(new BinarizationMethod1());
interface_ = interfacetemp;
}
if (method == Method2)
{
BiinterfacePtr interfacetemp(new BinarizationMethod2());
interface_ = interfacetemp;
}
....
}
bool run()
{
interface_->run();
}
Image* output()
{
return interface->output();
}
}
可以看到,不同二值化方法的实现都是在Biinterface
类中完成的。当我们使用Binarization
类时,我们可以通过调用方法来表示我们想要使用的set
方法。但是,不同的二值化方法可能有不同的参数设置,结构Binarizationpara
会变得复杂。
解决方案 2
class BinarizationMethod1()
{
public:
perform_binarization(Image *p_in, Image *p_out, BinarizationMethod1Para ¶);
}
class BinarizationMethod2()
{
public:
perform_binarization(Image *p_in, Image *p_out, BinarizationMethod2Para ¶);
}
我的问题是哪个更好。欢迎提出有关设计图书馆的想法。谢谢!