我正在开发一个应用程序,允许其用户对他们上传的图像应用不同的过滤器。但是,还有另一项要求需要在这里完成。该应用程序应该允许用户在原始图像上对累积效果应用多个过滤器。是否有可用于实现此设计模式?我提出了以下两种可用于实现此设计的方法:
Filter
接口,该接口由各种ConcreteFilter
类实现,并定义一个新类CompositeFilter
,用于收集Filter
个实例。 Filter
抽象类,其中包含对Filter
本身的对象的引用,该对象由各种ConcreteFilter
类(它们是装饰器)扩展在这种情况下)。 第一个选项似乎更适合我,因为我不确定第二个方法是否满足Decorator模式的意图:动态地为(增强)单个组件添加额外的职责。每种方法的潜在用途和缺点是什么,可以用哪种方法来满足要求?
感谢。
答案 0 :(得分:1)
如果您的问题是"我应该使用基于接口的类型系统添加我的功能"与"我应该使用抽象类"来添加我的功能,那么答案通常都是......两者。
应尽可能使用接口来定义类型。拥有一个Filter接口,它构成了过滤器类如何实现其功能的合同,这绝对是正确的做法。
抽象类的主要优点是它们使您能够为该类型提供部分或接近完整的实现。它们曾经是在Java 8之前提供默认方法的唯一方法(现在Java 8允许您在接口声明中放置默认方法)。
所以我建议如下:
使用界面定义您的类型。
如果您的类型具有您的类型的所有成员(例如共享字段或默认方法)通用的实现,那么正确的做法是声明一个实现您的类型接口的抽象类。按照惯例,类型接口的抽象类名为" Type"将是" AbstractType"。
对于所有过滤器类来说,简单地扩展AbstractFilter就是一件简单的事情。然后,您的类型获得了基于接口的类型系统的所有优点,以及简化实现者工作的抽象类的优点。您可能还希望考虑抽象装饰模式,如果它符合您的需求:Question about decorator pattern and the abstract decorator class?