首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数化策略模式

参数化策略模式
EN

Stack Overflow用户
提问于 2010-04-18 19:21:29
回答 3查看 2.3K关注 0票数 6

我有几个实现策略模式的Java类。每个类都有不同类型的变量参数:

代码语言:javascript
复制
interface Strategy {
     public data execute(data);
}

class StrategyA implements Strategy {
     public data execute(data);
}

class StrategyB implements Strategy {
      public StrategyB(int paramA, int paramB);
      public data execute(data);
}

class StrategyC implements Strategy {
      public StrategyC(int paramA, String paramB, double paramC);
      public data execute(data);
}

现在,我希望用户可以在某种UI中输入参数。UI应该在运行时选择,即策略应该独立于它。参数对话框不应该是整体的,应该有可能使其行为和外观对于每个策略和UI (例如控制台或Swing)不同。

你将如何解决这个问题?

EN

回答 3

Stack Overflow用户

发布于 2010-04-18 20:06:27

一种可能性是使用类似于Builder设计模式的东西:

对于每个策略类型,您都应该有一个相应的构建器(一个或多个)。构建器不会像普通构建器那样接收所有初始化参数作为方法参数;相反,它应该阻塞,直到接收到相关的输入。一些构建器将显示Swing对话框并等待,其他构建器将打印到控制台并等待输入,其他构建器可以从文件读取,等等。在构建器接收到所有输入后,它可以创建策略实例并返回它。

这样,您就可以将数据检索逻辑与策略本身解耦。另一个好处是您可以拥有所有构建器的通用接口,因此一旦您选择了特定的构建器,您就可以使用相同的代码来操作它。

票数 4
EN

Stack Overflow用户

发布于 2010-04-18 20:37:18

这个问题的解决方案主要取决于是什么决定了哪个策略是当前策略。为简单起见,我假设所有策略的UI都是相同的。

实际上,您将创建一个构建器类或工厂方法。沿着这条线的东西:

代码语言:javascript
复制
interface StrategyPicker {
    public Strategy getStrategy();
}

// Most likely used in the JFrame it is added to
class StrategyPickerUI extends JPanel implements StrategyPicker {
    // initialize the panel with all the widgets
    // and implement the getStrategy method. the getStrategy
    // method should be called after the input is done in this
    // panel (such as clicking an Ok or Apply button)
}

// You can also make one for the console app
class StrategyPickerSimple implements StrategyPicker {
    // ...
}

如果你想做得更好,你可以创建一个简单的工厂类来去掉在它自己的类中创建的行为:

代码语言:javascript
复制
public class StrategyFactory() {
    public static Strategy createStrategyFromParameters(StrategyParams sp) {
        // creates the Strategy object... doesn't need to be public static
        // and if it isn't, it will help making unit tests easier
    }

    // This nested class could be split up to StrategyAParams, 
    // StrategyBParams, StrategyCParams
    public class StrategyParams {
        data paramA; 
        int paramB_A;
        int paramB_B;
        int paramC_A;
        String paramC_B;
        float paramC_C;
    }
}

// in StrategyPickerUI class
    public getStrategy() {
        StrategyParams sp = new StrategyParams();
        sp.paramB_A = myJTextFieldParamB_A.getText();
           // and so on...
        return StrategyFactory.createStrategyFromParameters(sp);
    }

如果你想保持UI的非整体式,那么就把职责划分到他们自己的对象上。希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2010-05-06 00:21:08

如果参数类包含简单对象(数字、布尔值、日期、字符串),则可以尝试在运行时生成接口。

为组合对象和参数集合生成UI将更加困难

看看Metawidget,它是一个强大的ui生成器。

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

https://stackoverflow.com/questions/2662043

复制
相关文章

相似问题

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