【问题标题】:Separation of concerns - how to achieve with this code [closed]关注点分离 - 如何使用此代码实现 [关闭]
【发布时间】:2013-04-24 16:00:38
【问题描述】:

我有以下场景(这适合更大的 mvc 框架)

有一个大型的 xml 配置,它定义了可用于系统特定功能的模型类型:

<object_type1_config>
    <type_id>1</type_id>
    <type_model>amazinTypeModel</type_model>
    <config_value1>blah</config_value1>
    <config_value2>blah blah</config_value2>
</object_type1_config>

在控制器中,根据某些请求参数,我可以决定在运行时使用哪个模型并确定要渲染哪个模板等。

另一个复杂性是,如果该模型类型的配置中不存在某些值,则可以使用一组默认值。这组默认值将用作所有可能的对象类型的默认值。

问题是控制器正在填充用于解析此配置值以获取参数然后根据这些参数做出决策的逻辑。

因此将它移到另一个类是有意义的,但是在这里使用的最佳设计模式是什么,因为控制器实际上仍然必须解析配置才能首先获取模型类型。然后它必须实例化模型类型并查询它的值。

我在这里看不到任何解耦的方法

【问题讨论】:

    标签: java design-patterns decoupling


    【解决方案1】:

    你可以这样做

    class Controller {
        Parser parser;
    
        Model getModel() {
            return parser.parseModel(userInput);
        }
    
        Template getTemplate() {
            return parser.parseTemplate(userInput);
        }
    }
    

    等等,解析器已经引用了默认配置值(在解析器中硬编码,例如作为属性文件名,或传递给它的构造函数)。您可以通过构造函数/设置器设置 Parser,或者如果您使用的是 Spring,您可以自动装配它。

    【讨论】:

    • 还有1个要求,让我快速更新问题
    • 好的,我已经更新了。它与默认值有关
    • 我已经更新了我的答案以反映这些变化
    • 那么解析器是不是在这里有太多的责任。它就像一个工厂——它在这里创建模型。但是它对默认值也有一定的责任感,这表明它也有一些商业知识
    • 您不想将默认值硬编码到解析器中,因为正如您所说,这会给它太多的业务知识,但如果您只是给它默认的名称properties 配置文件或更好的将默认配置对象传递给它的构造函数,那么你应该没问题。 (默认配置对象比默认配置文件名更好,因为这消除了解析器执行 IO 的需要)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多