我想在apache commons电子邮件中扩展基类,基类是Email。我只是想为.send()方法添加一些限制
其他3个类扩展了Email:HtmlEmail,SimpleEmail和MultiPartEmail
没有工厂方法可以创建这3个派生类。
我是否有最好的方法可以从基本的电子邮件类扩展这一方法?我能想到的是扩展3个派生类,在每个派生类中重写.send(),并让每个派生用一个公共静态方法来完成.send()限制功能。
答案 0 :(得分:19)
看起来您可以使用decorator pattern并撰写例如一个ThrottledEmail
。它只是装饰Email
的另一个实例(它可以是 ANY Email
子类),它可以@Override
send
方法来强制执行某些限制。所有其他方法都只是委托给基础Email
实例。
这类似于java.io.BufferedReader
的工作方式。它可以装饰任何Reader
以赋予其缓冲功能。其他示例包括java.util.Collections
,它提供实用程序方法,例如Collection<T> synchronizedCollection(Collection<T>)
,它包装 ANY Collection<T>
并使用同步功能对其进行修饰。
除非明确记录基类以便于@Override
某些方法的子类,否则通常应该优先考虑组合( has-a )而不是继承( is-a )关系。