课堂互动的设计模式

时间:2010-10-13 13:39:11

标签: design-patterns class architecture class-design

我在确定两个类应该如何交互时遇到一些麻烦,我遇到的问题似乎会出现很多,所以我想知道是否有人知道一个设计模式(或任何类型的解决方案)我的问题。

基本上我有两节课。 A类处理向用户显示信息,B类处理存储数据。 A类需要从B类获取数据,根据A类的内部状态格式化数据,然后输出数据。例如,类B包含英文字符串,类A将始终将这些字符串转换为由类A的实例变量指定的语言,然后再对它们进行任何进一步处理。

我可以为此提出两种可能的解决方案,但它们都不是很干净。

  1. 使B类成为A类的实例变量。在A类中编写函数,从B类中获取数据并将其格式化以用于A类中的其他函数。 这个解决方案看起来不太好,因为它不会阻止A类直接访问B类中的数据而不进行格式化。

  2. 创建一个扩展了B类的C类。使C类成为A类的实例变量.C类将覆盖B类的Getters,以便始终将格式应用于数据。但是为了格式化数据,C类需要了解A类的内部状态。这可以通过将指向A类的指针传递给C类的构造函数来实现。然后,C类可以调用A类中计算A类内部状态的函数。

  3. 让我知道这是否令人困惑,我可以提供一个更具体的例子。

    感谢

3 个答案:

答案 0 :(得分:3)

在备选方案#1中,我不认为“停止A类直接访问B类中的数据而不进行格式化”是一个问题。 任何类都可能无法按照它的说法执行操作,这样做并不是一个糟糕的设计。所以我认为这不是一个有效的问题。 A是唯一知道其内部状态的东西,因此它应该提供转换输出的逻辑。

可能会根据您的需求过度设计的另一种选择是使用类似策略模式的东西。基本上,B接受一种策略来格式化数据,并且在该函数中(A会提供)你可以依赖A的状态。

这样的事情:

interface FormattingStrategy {
    public String format(String input);
}

class B {
    public String getFormattedStringA(FormattingStrategy formatter)...
}

class A {

    public void someMethod() {
         String a = getFormattedStringA(new FormattingStrategy() {
             public String format(String input) {
                 if (someAState) {
                    //...
                 }
             }
         };
    }
}

策略可以是A的实例变量。这使B与A完全分离,仅与FormattingStrategy接口耦合。

答案 1 :(得分:0)

听起来像是:

答案 2 :(得分:0)


你犯的一个错误是A,B,C类的命名你不应该这样做。更好的是将您的类命名为更真实的对象,例如职业或真实的东西,因为您将从名称中获得解决方案。如果你提到模式......
他们的名字有:Model-View,Fabrique,Decorator,Observer。挖它?
对你的问题:有数据的类是你的“模型”,显示你的数据的类是你的“视图”
如果您处理语言,可以查看解释器模式。但我必须承认我并不真正理解这个问题,这对我来说听起来有点困惑