【问题标题】:What design pattern can I use to complete a several steps process?我可以使用什么设计模式来完成几个步骤的过程?
【发布时间】:2015-07-19 14:13:59
【问题描述】:

我正在开发一个 Android 应用程序,它需要几个步骤的注册过程。因为我需要收集的数据量很大,所以我为每个步骤创建了一个活动和一个不同的片段。例如,在第一步/片段中,用户必须提供基本信息(姓名、性别、电子邮件),在第二步/片段中,教育信息(大学、学位、参加日期)和最后一步/片段中的经验信息(公司、标题、日期)。用户正确完成所有步骤后,我会在单个 JSON 请求中将所有信息发送到我的 Web 服务。

我的问题是:以优雅、可读和可测试的方式更好地模拟这个问题的设计或设计模式是什么?我目前使用的方法,我认为它根本不好,并且可能会在应用程序中造成内存泄漏:

    class Registration {

        // Contains basic user information such as name, gender, etc
        private User user; 

        // Each Education instance contains info such as university, degree, etc 
        private List<Education> studies; 

        // Each Experience instance contains info such as company name, title, etc
        private List<Experience> workExperience;

        private static Registration currentRegistration;

        public static Registration getCurrent() {
            if (currentRegistration == null) {
                currentRegistration = new Registration();
            }
            return currentRegistration;
        }

        /* There are getter and setter methods for each field */
    }

如您所见,我已经创建了带有所需字段的 Registration 类和一个静态引用实例,该实例表示通过 getCurrent 方法提供给从其 onCreate 方法调用它并设置该步骤信息的每个片段的当前注册想到了相应的setter方法。当用户输入所有数据后,我将此 POJO 转换为 JSON 并发出网络请求。

另一种方法是将 Registration 实例从片段 A 传递到 B,我需要为此实现可序列化接口,但我不喜欢这种方法。

我想到了 Builder 和 JavaBean 模式,但是当我必须在单个块语句中初始化对象时,我认为它们更合适。关于如何正确建模此问题的任何建议? :)

【问题讨论】:

    标签: android algorithm oop design-patterns architecture


    【解决方案1】:

    你把一件非常简单的事情复杂化了。

    我以前做过这种类型的实现,就注册实现而言,它实际上相当普遍。我不确定是否有更好的选择,我见过很多不同的选择,但与我通常的做法相比,它们在简单性方面都失败了:

    1. 扩展选择的视图组 - 通常是滚动视图 - 创建 xml 布局并将其扩展到您的自定义视图组中。
    2. 在上述 xml 中添加包含每个注册步骤的不同视图组,并将可见性设置为消失。
    3. 在每个注册页面上添加一个按钮以转到下一个。
    4. 在您的自定义视图组中,请确保通过首先验证数据来处理“下一步”按钮。
    5. 当用户完成注册步骤时,您可以简单地从适当的字段(即 passwordView.getText().toString())中检索所有数据,并且您可以放心地执行此操作,因为您不会得到任何空指针或意外,因为您在不同步骤中验证了所有数据。
    6. 如果您添加页面更改视图动画,则会获得奖励积分。

    KISS

    【讨论】:

    • @jvrodriguez 首先感谢您的回答,但我不能使用这种方法。我所描述的是对我的真正问题的一个非常简单的抽象,我使用它只是为了让我的问题易于理解。我认为实施像您这样的解决方案迫使我拥有一个具有很多责任的上帝对象en.wikipedia.org/wiki/God_object)。我喜欢为每个特性创建功能和单元测试,而将所有逻辑放在一个类中会很麻烦。
    • 好吧,根据定义,上帝对象是一个执行太多任务的对象,它只执行一个,可能很长,但仍然只有一个。无论哪种方式,我都同意我可能低估了您需要用户提供的数据量。话虽如此,我建议实现bit.ly/1hZQWAh 以在每个片段之后与活动进行通信并逐步构建对象。
    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 2011-08-13
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多