如何在类实例和这些属性的其他可能用户之间共享属性?

时间:2017-08-18 02:39:52

标签: java class design-patterns

假设有多个类{ 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 的类数量大幅增加超过两个?是否有任何特定的设计模式可用于解决此问题?

2 个答案:

答案 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));
}