假设有多个类{ C1 , C2 ,...}实现了一个接口 I ,其中包含其他内容,方法称为 getColor(), getName()和 move()。当 getColor()和 getName()被调用时, C1 的每个实例都返回相同的值,与< em> C2 以及实现 I 的所有其他类。 Move也是按类定义的,但受实例变量的影响,并且每个实例的行为可能不同。 C1 类中 getColor()和 getName()的实现可能如下所示:
public Color getColor() {
return Color.RED;
}
public String getName() {
return "C1!!!";
}
实现界面 I 的所有对象都可以添加到屏幕并绘制到屏幕上。但是,假设添加这些对象的方式是通过不同的屏幕,其上有按钮。当单击其中一个按钮时,它会向应用程序发出信号,告知应将与被点击相关联的对象类型添加到屏幕中。
如果目标是使用 C1 的 getName()返回的字符串标记与 C1 相关联的按钮并为按钮着色使用Color返回 C1 的 getColor(),可以实例化 C1 的新实例,然后检索其名称和颜色以自定义它的相关按钮:
...
I instance = new C1();
Button C1Button = new Button();
C1Button.setLabel(instance.getName());
C1Button.setColor(instance.getColor());
...
...然后实例化一个新的 C2 和 C3 以及......和 C50 的实例,遵循与之相同的过程 C1 。
这看起来相当脏,但是为了完成 I 中的其他方法,类不再被实例化,只是为了获得颜色和按钮的名称属性。此外,这将是一个非常多的代码。任何人都可以提供关于颜色和名称属性如何解耦与实现 I 的类的建议,所以至于减少所需代码的长度,如果实现 I 的类数量大幅增加超过两个?是否有任何特定的设计模式可用于解决此问题?
答案 0 :(得分:1)
我通常通过制作这样的枚举来做这种事情,与实现类分开
for (TypeOfC t : TypeOfC.values())
{
Button b = new Button();
b.setColor(t.getColor());
b.setLabel(t.name()); // make a different getter if you don't want the enum constant name
b.setAction(()->doWatever(t.create()));
allButtons.add(b);
}
然后你可以制作如下按钮:
{{1}}
答案 1 :(得分:0)
我发现一个可能的答案涉及使用type object模式之类的东西。它似乎在概念上与马特的建议有关。不是定义从 I 继承的多个不同的类,而是只需要定义一个类 C ,它接受另一个类 Properties ,它的构造函数。然后可以从与之关联的 Properties 类中检索 C 的所有属性:
public class C implements I {
private final Properties properties;
public C(Properties p) {
this.properties = p;
}
@Override
public Properties getProperties() {
return properties;
}
}
属性都可以在 PropertyDictionary 中定义。构造新的 C 时,可以从 PropertyDictionary 中获取对象的相应属性。这样,从 I 继承的类仍然保持相同的功能(但在更改的方法名称中),并且数据的其他加速器可以了解他们想要的关于 C的可能值的内容可以通过查询PropertyDictionary:
Properties p = new Properties("Class name", Color.YELLER);
I instance = new C(p);
// instance.getProperties().getColor() == p.getColor(); --> True
...
for(Properties prop : PropertyDictionary.getProperties()) {
Button b = new Button();
b.setLabel(prop.getName());
b.setColor(prop.getColor());
}
具有相同属性的 C 的多个实例都引用 PropertyDictionary 中的相同属性实例,就像在Flyweight中一样:
final Properties p = new Properties("Cat", Color.BLACK);
List<I> cats = new ArrayList<>(1000);
// make 1000 black cats:
for(int i = 0; i < 1000; i++) {
cats.add(new C(p));
}