python中数据对象间的转换器设计
我正在为可以相互转换的类似数据对象实现一个库。为了更加说明问题,我将在下面假设数据对象是不同的图像类型。我有以下几节课python中数据对象间的转换器设计,python,design-patterns,converter,Python,Design Patterns,Converter,我正在为可以相互转换的类似数据对象实现一个库。为了更加说明问题,我将在下面假设数据对象是不同的图像类型。我有以下几节课 class PixelImage(object): pass class VectorImage(object): pass class FourierImage(object): pass 在这两者之间设置转换器功能的好方法是什么?这种情况下有什么设计模式吗?问题是,转换器需要一定数量的知识,包括源类和目标类,但我希望防止类之间存在强烈的依赖性。
class PixelImage(object):
pass
class VectorImage(object):
pass
class FourierImage(object):
pass
在这两者之间设置转换器功能的好方法是什么?这种情况下有什么设计模式吗?问题是,转换器需要一定数量的知识,包括源类和目标类,但我希望防止类之间存在强烈的依赖性。此外,如果设计开放,以后可以添加派生类(例如,类压缩像素图像(PixelImage)
)
下面我将讨论我提出的两个解决方案。我们非常欢迎其他办法和意见。谢谢 解决方案1:使用成员函数来_TargetFormat()
,例如
pixel_image = PixelImage()
vector_image = pixel_image.to_vector()
pixel_image = PixelImage()
vector_image = VectorImage.from_pixel(pixel_image)
优点:它很短,用户可以直接在API中看到对象的可能转换(例如在交互式ipython shell中)
缺点:我们的耦合很紧。PixelImage必须了解VectorImage类,特别是它的构造函数,因为它必须创建VectorImage对象。如果我有很多类,每个类都要导入其他所有类
解决方案2:使用_SourceFormat()中的类方法,例如
pixel_image = PixelImage()
vector_image = pixel_image.to_vector()
pixel_image = PixelImage()
vector_image = VectorImage.from_pixel(pixel_image)
优点:无显式耦合。我们可以输入任何像素的类似图像的对象,并从duck类型中获益。
缺点:类方法调用看起来不那么优雅,可能对用户来说不够直观。为什么不使用工厂?解决方案3:使用第三个包含转换逻辑的通用图像
对象。这也有效地防止了耦合,因为除了泛型类之外,任何类都不需要关于其他格式的知识?