首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >课堂交互的设计模式

课堂交互的设计模式
EN

Stack Overflow用户
提问于 2010-10-13 13:39:10
回答 3查看 344关注 0票数 2

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

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

我可以想出两种可能的解决方案,但它们看起来都不太干净。

  1. 将类B作为A类的实例变量,A类中的写函数将数据从B类中取出并格式化以供A类中的其他函数使用。这种解决方案似乎不太好,因为它不会阻止A类直接访问B类中的数据而不格式化它。
  2. 使类C扩展类B,使类C成为A类的实例变量,C类将覆盖B类的Getters,以便始终将格式应用于数据。然而,为了格式化数据,C类需要了解A类的内部状态。这可以通过将指向A类的指针传递给C类的构造函数来实现。然后,C类可以调用A类中的一个函数来计算A类的内部状态。

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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-13 14:01:51

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

为了满足您的需求,另一种可能会被过度设计的方法是使用类似于策略模式的东西。基本上,B接受格式化数据的策略,在该函数(A将提供)中,您可以依赖于A的状态。

就像这样:

代码语言:javascript
复制
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接口耦合。

票数 3
EN

Stack Overflow用户

发布于 2010-10-13 13:43:32

听起来像是:

  • 观察者
  • 模型-视图
票数 0
EN

Stack Overflow用户

发布于 2010-10-13 14:05:26

你犯的一个错误是A,B,C类的命名--你不应该这样做。最好是将类命名为更真实的对象,如职业或真实的东西,因为您将从名称中直接获得解决方案。如果你提到模式..。

他们有这样的名字:模型-视图,法布里克,装饰,观察者。挖它?

对于您的问题:包含数据的类是您的“模型”,显示您的数据的类是您的“视图”。

如果您处理语言,请看一下解释器模式。但是我必须承认我并不真正理解这个问题,这听起来有点让我困惑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3924293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档