为确保我理解您的要求,以下是我根据我对问题的阅读做出的假设:
- 数据是某种二进制格式(可能是图像,但正如您所说,它可以是任何东西),可以表示为字节数组
- 有许多处理步骤(我将它们称为转换)可以应用于数据
- 某些转换依赖于其他转换,例如,如果未应用转换的先决条件,您希望避免应用转换。您希望它是健壮的,以便检测和阻止尝试应用非法转换。
问题是如何以面向对象的方式做到这一点,从而避免将来随着程序复杂性的增加而出现错误。
一种方法是让图像数据对象(封装了二进制数据和已应用到它的转换的记录)通过 Transformation 对象委托负责执行转换;Transformation 对象既实现了处理算法,又实现了基于之前的转换是否可以应用它的知识。
因此,您可以定义以下内容(请原谅我的类似 Java 的命名风格;自从我完成 C++ 以来已经有很长时间了):
- 一个名为 TransformationType 的枚举类型
- 一个名为 Transformer 的抽象类,具有以下方法:
- 一个名为“getType”的方法,它返回一个 TransformationType
- 一个名为“canTransform”的方法,它接受一个 TransformationType 列表并返回一个布尔值。该列表表示已经应用于数据的转换,布尔值表示是否可以执行此转换。
- 一种称为“转换”的方法,它接受一个字节数组并返回一个(可能是修改过的)字节数组
- 一个名为 BinaryData 的类,包含一个字节数组和一个 TransformationType 列表。此类实现方法“void transform(Transformer t)”以执行以下操作:
- 查询转换器的 'canTransform' 方法,传递转换类型列表;如果 canTransform 返回 false,则抛出异常或返回
- 用调用 t.transform(data) 的结果替换字节数组
- 将变压器的类型添加到列表中
我认为这可以实现您想要的 - 图像转换算法在类中以多态方式定义,但转换的实际应用仍然由数据对象“控制”。因此,我们不必信任外部代码来做正确的事情,例如设置/检查标志等。