它看起来像使用适配器模式。这个想法是在给定另一个类的情况下创建一个类的“视图”,或者调整一种类型的类来充当另一个类。
一个简单的现实世界示例可以是电源插座。在不同的国家,使用不同类型的插座。因此,您使用适配器将手机插入通常无法“识别”的电源插座。
当然,这也可以使用面向对象编程和适配器模式来建模。使用您的 IModel 接口但将其命名为 IAdaptable 它可以像这样使用。
public interface IAdaptable {
<T> T adaptAs(Class<T> clazz);
}
public interface IChargeAmerican { void chargePhoneInAmerica(); }
public interface IChargeEurope { void chargePhoneInEurope(); }
public class EuropeanSocket implements IAdaptable, IChargeEurope {
public <T> T adaptAs(Class<T> clazz) {
if (clazz.equals(IChargeAmerican.class)) {
return new EuropeanSocketToAmericanSocketAdapter(this);
}
throw new RuntimeException("unknown");
}
public void chargePhoneInEurope() {
;
}
}
public class AmericanSocket implements IChargeAmerican {
public void chargePhoneInAmerica() {
;
}
}
public class EuropeanSocketToAmericanSocketAdapter implements IChargeAmerican {
private EuropeanSocket socket;
public EuropeanSocketToAmericanSocketAdapter(EuropeanSocket socket) {
this.socket = socket;
}
public void chargePhoneInAmerica() {
socket.chargePhoneInEurope();
}
}
要使用它,只需将欧洲插座适应美国插座,有点像在两者之间插入适配器。
public void foo() {
EuropeanSocket europe = new EuropeanSocket();
IChargeAmerican murica = europe.adaptAs(IChargeAmerican.class);
murica.chargePhoneInAmerica();
}
此示例显示了 adaptAs 方法如何在 IChargeAmerican 和 IChargeEurope 两个接口之间创建链接。即使它们没有任何共同点,适配器也可以像它们那样工作。
现在,EuropeanSocket 实现了 IAdaptable 接口,以便将自己“转换”为另一个已知的套接字。通常尽管班级不应该对此负责。正如 wikipedia 上的示例所示,工厂或供应商更适合于此。