如果您知道 的具体实现P
,即如果它们不是从某个地方提供的,那么您可以使用访问者模式:
abstract class P {
int p1;
int p2;
abstract void visit(final PVisitor visitor);
}
class P1 extends P {
int p3;
int p4;
@Override
void visit(PVisitor visitor) {
visitor.doStuff(this);
}
}
class P2 extends P {
int p5;
int p6;
@Override
void visit(PVisitor visitor) {
visitor.doStuff(this);
}
}
interface PVisitor {
void doStuff(P1 p);
void doStuff(P2 p);
}
所以你有一个Collection<PVisitor>
访问者逻辑,然后你P
用你的 s 访问你的实例,PVisitor
多态性将计算出什么是什么。
编辑
根据 OP 的评论,我有一个想法。
抽象工厂模式与访问者模式和一些泛型相结合呢?
我们的想法是,我们知道如果我们添加一种新的类型,Handler
那么就需要改变一些东西——从逻辑上讲,它应该是HandlerFactory
实现而不是P
s。如果我们有一个abstract HandlerFactory
并且每个P
实现负责返回一个处理它的实例怎么办。
然后,工厂有许多返回特定处理程序的方法,getDatabaseHandler
例如等。这些Handler
可以从泛型Handler
类继承。
这个想法看起来像这样:
abstract class P {
int p1;
int p2;
public abstract HandlerFactory<? extends P> getHandlerFactory();
}
class P1 extends P {
int p3;
int p4;
@Override
public HandlerFactory<P1> getHandlerFactory() {
return new P1HandlerFactory(this);
}
}
class P2 extends P {
int p5;
int p6;
@Override
public HandlerFactory<? extends P> getHandlerFactory() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
abstract class HandlerFactory<T extends P> {
private T t;
public HandlerFactory(T t) {
this.t = t;
}
public T getT() {
return t;
}
public abstract DatabaseHandler<T> getDatabaseHandler();
public abstract JMSHandler<T> getJMSHandler();
}
abstract class Handler<T extends P> {
private final T t;
public Handler(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
abstract class DatabaseHandler<T extends P> extends Handler<T> {
public DatabaseHandler(T t) {
super(t);
}
public abstract void persist(Connection con);
}
abstract class JMSHandler<T extends P> extends Handler<T> {
public JMSHandler(T t) {
super(t);
}
public abstract void send();
}
class P1HandlerFactory extends HandlerFactory<P1> {
public P1HandlerFactory(P1 t) {
super(t);
}
@Override
public DatabaseHandler<P1> getDatabaseHandler() {
return new P1DatabaseHandler(getT());
}
@Override
public JMSHandler<P1> getJMSHandler() {
return new P1JMSHandler(getT());
}
}
class P1DatabaseHandler extends DatabaseHandler<P1> {
public P1DatabaseHandler(P1 p1) {
super(p1);
}
@Override
public void persist(Connection con) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
class P1JMSHandler extends JMSHandler<P1> {
public P1JMSHandler(P1 p1) {
super(p1);
}
@Override
public void send() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
所以每个实现P
都附带一个同伴HandlerFactory
,添加一个新的实现P
只需要HandlerFactory
为它实现一个。例如,泛型的使用允许P1A
并且P1B
继承自,如果它们不需要任何更改,则P1
仅使用 a 。P1Handler
如果Handler
添加了一种新的类型,那么所有HandlerFactory
实现都需要更改以拥有获取该类型的方法,Handler
但P
s 不需要更改。
用法看起来像
final P1 p1 = new P1();
final DatabaseHandler<P1> databaseHandler = p1.getHandlerFactory().getDatabaseHandler();
因此,您可以从该实例获取该实例的特定数据库处理程序。