Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >哪种设计模式最适合?

哪种设计模式最适合?
EN

Software Engineering用户
提问于 2015-01-12 03:38:20
回答 3查看 2.6K关注 0票数 -1

我一直在研究设计模式,我希望在我的最新项目中实现它们。

我正在开发一个Windows服务,它定期检查数据库表中的一个新条目。根据找到的条目,服务将执行许多进程。

可能的程序包括:

1)生成报告并发送电子邮件并附上报告。

2)运行查询并将数据记录到另一个表。

3)发送通知电子邮件

什么样的设计模式最适合?我一直在考虑工厂模式。

到目前为止我的设计过程..。

1)创建接口

2)创建实现接口的抽象类

3)抽象方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- CheckTable()
- GenerateReport()
- SendEmail()

4)工厂设计模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- The client(windows service) asks the Factory for a new object (based of the database entry found)
- The factory instantiates this and returns to the client
- The client then calls the relevant methods to send email or run query.

这个看起来对吗?还是我让事情变得比现在更困难了?

还是我应该使用观察者模式?

更新:

好的。我接受了你的建议,并寻找最简单的方法来做这件事。

下面的内容正确吗?我创建了一个接口,然后创建了一个类来实现这个接口。

可能会产生一些不同的报告/电子邮件。这些应该作为新方法添加到接口中吗?

我需要一个抽象的课程吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// interface
internal interface IJobs
{
    void SendEmail();
    void PublishData();
    void GenerateTestReport(string userID, DateTime period);
}


// concrete class
public sealed class JobsFactory : IJobs
{
    #region SINGLETON

    private static JobsFactory INSTANCE;

    private JobsFactory() { }

    public static JobsFactory GetInstance()
    {
        if (INSTANCE == null)
        {
            INSTANCE = new JobsFactory();
        }
        return INSTANCE;
    }

    #endregion

    private readonly WorkbookFactory _workbookFactory = WorkbookFactory.GetInstance();

    #region IJobs Members

    public void SendEmail()
    {
        // send email
    }

    public void PublishData()
    {
        // publish data
    }

    public void GenerateTestReport(string userID, DateTime period)
    {
        string reportTestFilePath = this._workbookFactory.BuildTestReportWorkbook(userID, period);
    }

    #endregion
}
EN

回答 3

Software Engineering用户

发布于 2015-01-12 04:19:16

我给你讲个故事。许多年前,当我还是一名年轻的、缺乏经验的程序员时,GoF不久就出版了他们的“设计模式”( Design )一书,而Java是一种新的语言,也是唯一一个普遍可用的用户界面库,因为它是AWT,而且AWT应用程序看起来都很难看,我的公司决定将开发从C++转向Java。但是AWT是不可能的:我们的应用程序被要求看起来和感觉就像本地的Win 32应用程序,而你不能用AWT实现这一点。因此,我的任务是学习JNI,并实现一个框架,允许我们使用Java构建本机windows用户界面。

不久之前,我就读到了有关的文章,并且渴望使用它们,所以我查看了我的项目,并考虑了哪些项目适合在哪里使用。我最自豪的想法是:我有一个本机窗口对象,它封装了一个win32窗口句柄,但是为了允许应用程序将行为附加到窗口,我会使用责任链。这将让应用程序使用现有的行为并以新的方式组合它们,一切都会很棒。

所以我实现了责任链,它比只有一个行为对象来管理一切要复杂一些,但是我用它编写了几个测试,一切都运行得很好。

然后我们部署了框架,并开始使用它编写真正的应用程序,您知道吗?我们从未使用过该工具在一个窗口中链接多个行为。

这里的教训很简单:不要从使用Design目录开始在应用程序中购买额外的灵活性。首先考虑您真正需要的灵活性,然后考虑如何实现这种灵活性。也许标准模式是实现这一目标的最佳方式。也许有一种更简单、更直接的方法。甚至可能会出现这样的情况:您有一个僵化的、定义明确的问题,这个问题足够小,您可以简单地设计整个解决方案,而不需要任何空间来改变以后的行为,在这种情况下,任何类似于设计模式的事情都可能会造成过度的后果。

借用肯特·贝克( Kent Beck )的一句话:“做最简单的事情,这可能会奏效。”如果这看起来像一种模式,那就太好了。但如果不是的话别担心。

票数 20
EN

Software Engineering用户

发布于 2015-01-12 09:00:47

我一开始就不使用任何模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var records = CheckTable();
foreach(var record in records)
{
    GenerateReport(record);
    SendEmail(record);
}

一开始很简单,并不是每件事都需要一个模式。如果您开始执行许多不同的任务,或者允许按顺序配置任务和每个记录中运行的任务数,那么可以考虑通过重构将其抽象出来。

票数 5
EN

Software Engineering用户

发布于 2015-01-12 04:03:16

由于您需要执行似乎是轮询的操作,所以您可以查看一下Observer Pattern。这将允许您的服务调用您的方法,以便它们能够采取适当的操作。

尽管如此,正如评论中提到的那样,您似乎拥有相反的设计模式。这个任务应该引导你进入一个设计模式。试图将您的需求封装在特定的设计模式中并不是处理设计的最佳方法。

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

https://softwareengineering.stackexchange.com/questions/269808

复制
相关文章
javascript reduce
reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。
chuchur
2022/10/25
4960
关于 JavaScript 中的 reduce() 方法
reduce() 方法对数组中的每个元素执行一个升序执行的 reducer 函数,并将结果汇总为单个返回值
Leophen
2020/03/18
1.4K0
小程序点击跳转页面并传入一个对象及接受
传参data-item="{{item}}" <view wx:for="{{ list }}" wx:key="{{ index }}" catchtap="onclick" data-item="{{item}}"> <image src="{{ item.images.small }}"></image> <text>{{ item.title }}</text> </view> 点击事件 onclick(e){ let item =e.currentTarget.datas
江一铭
2022/06/16
3580
JavaScript 添加一个元素标签[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152091.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/25
5590
JavaScript 添加一个元素标签[通俗易懂]
深入理解JavaScript函数式编程
什么是函数式编程(Functional Programming, FP):FP 是编程范式之一.(还有面向过程编程、面向对象编程)
用户3045442
2020/07/31
4.3K0
深入理解JavaScript函数式编程
前端优化--使用JavaScript添加交互
JavaScript 允许我们修改网页的方方面面:内容、样式以及它如何响应用户交互。 不过,JavaScript 也会阻止 DOM 构建和延缓网页渲染。 为了实现最佳性能,可以让您的 JavaScript 异步执行,并去除关键渲染路径中任何不必要的 JavaScript。
奋飛
2021/08/30
1.8K0
前端优化--使用JavaScript添加交互
翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 8 章:列表操作
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 第 8 章:列表操作 你是否还沉迷于上一节介绍的闭包/对象之中?欢迎回来
iKcamp
2018/01/04
3.5K0
翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 8 章:列表操作
前端优化--使用JavaScript添加交互
JavaScript 允许我们修改网页的方方面面:内容、样式以及它如何响应用户交互。 不过,JavaScript 也会阻止 DOM 构建和延缓网页渲染。 为了实现最佳性能,可以让您的 JavaScript 异步执行,并去除关键渲染路径中任何不必要的 JavaScript。
奋飛
2020/05/28
1.8K0
【说站】javascript函子是什么
1、作为特殊容器通过普通对象实现,该对象具有map方法,map方法可以运行函数处理值(变形关系)。
很酷的站长
2022/11/23
2440
【说站】javascript函子是什么
JavaScript函数式编程之函子
函子是一个特殊的容器,通过一个普通对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理(变形关系),容器包含值和值变形关系(这个变形关系就是函数)。函数式编程中解决副作用的存在
开水泡饭
2022/12/26
1.2K0
python使用reduce,lambd
>>> l = range(1,101) #定义l的数值范围1-100 >>> reduce(lambda x,y:x+y,l) #l数字传递给lamdba表达式,并reduce递归运算。 5050
py3study
2020/01/13
3200
父组件调用子组件方法并传入值
# 父组件调用子组件方法并传入值 通过ref引用调用子组件内的方法并传入参数 父组件: <子组件标签 ref="refName"></子组件标签> methods: { fnX(x) { this.$refs.refName.fnY(x) // 调用子组件方法并传入值 } } 子组件: methods: { fnY(x) { this.x = x } } }
小小杰啊
2022/12/21
1.2K0
reduce方法的使用
认识reduce 语法:arr.reduce(callbackFn,[initialValue]) callbackFn : 一个 “reducer” 函数,包含四个参数: previousValue:上一次调用 callbackFn 时的返回值。在第一次调用时,若指定了初始值 initialValue,其值则为 initialValue,否则为数组索引为 0 的元素 array[0] currentValue:数组中正在处理的元素。在第一次调用时,若指定了初始值 initialValue,其值则
且陶陶
2023/04/12
4710
reduce方法的使用
使用 JavaScript 创建并下载文件
本文将介绍如何使用 JavaScript 创建文件,并自动/手动将文件下载。这在导出原始数据时会比较方便。
零式的天空
2022/03/28
1.8K0
使用 JavaScript 创建并下载文件
sendfile函數的使用[通俗易懂]
sendfile函數linux內核新加的函數,可以使得網絡傳輸文件時用户层无需分配缓冲区给将要传输的文件,从而能够节约内存,并直接调用系统调用
全栈程序员站长
2022/09/05
5240
13个JavaScript数组reduce的实例方法
对比map、 forEach、 filter 等数组方法,reduce比它们更强。
前端达人
2021/05/11
7800
使用jquary和javascript动态添加tr
首先拿到json解析过的json对象,比如,var obj = eval(data);因为data可能存放的是对象, 这里就假设是对象。根据对象里面的属性,添加几个td。
微醺
2019/01/17
2.1K0
[译] 什么是函数式编程
作为一名开发者, 自然是想要写出优雅的, 易于维护的, 可扩展的, 可以预测的代码. 函数式编程(Functional Programming / FP)的原则能够很好的命中这些需求.
腾讯IVWEB团队
2020/06/28
1.6K0
iOS | 动态获取字符串宽高并添加约束
在 iOS 实际编码过程中,我们可能会需要通过代码动态的向某个 View 视图中添加 UILabel, 此时,我们必须手动的为这些 UILabel 对象添加约束条件,否则,这些 UILabel 将会因为没有约束条件而无法显示。
CnPeng
2021/02/03
7370
【JS】446- 你不知道的 map
如果你听说过Ramda,它也提供了和Array.prototype.map方法类似的map方法。
pingan8787
2019/12/24
1.4K0
【JS】446- 你不知道的 map

相似问题

JavaScript传入一个函数来映射();

50

使用Javascript Reduce添加一个属性并乘以另一个属性

19

传入键并返回对象javascript

211

javascript:使用reduce对某些字段进行集体添加?

20

构建HTML,将其作为XML传入,并使用javascript?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文