问题标签 [policy-based-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1860 浏览

c++ - 什么是 C++ 基于策略的类设计的好教程?

我刚刚开始阅读Modern C++ Design Generic programming 和 Design Patterns Applied并且我想知道在我深入研究之前是否需要阅读一些关于基于策略的类设计的非常基本的教程。第 1 章会提供我需要遵循的所有内容吗?

我已经熟悉模板使用(STL/boost/Poco)和编写模板类/方法。

0 投票
4 回答
33278 浏览

c++ - 基于策略的设计和最佳实践 - C++

我将上述代码作为基于学习策略的设计的一部分编写。我对上面的代码有几个问题

1 - 这个实现看起来正确吗?我的意思是:它真的看起来像基于策略的设计吗?

2 - 我现在可以将任何类型的笔挂到作家身上。但是当我得到一支没有默认构造函数(只有参数化构造函数)的笔时,我该怎么办?我将如何处理这种情况?

3 - 当使用上述代码时

我猜编译器会将PenType替换为InkPen。如果是,为什么我不能只从StartWriting()调用Write( )而不是为基类名称添加前缀(PenType::Write())?

4 - 我认为基于策略的设计迫使您从语义上无效的类中派生。在上面的代码中,writer 是从 pen 派生的,只是因为 writer 使用的是 pen。但是说作家是一支笔在语义上是无效的。有没有其他更好的方法来解决这个问题,或者我在这里遗漏了什么?

有什么想法吗?

0 投票
2 回答
30487 浏览

c++ - 如何使用类型列表

我在“现代 C++ 设计”中阅读了类型列表,并将其理解为某种类型的联合。通过将不同的、不相关的类型放入类型列表中,可以使用它一次表示多个类型,而无需继承。我在一些具有原始类型的简单函数中测试了 typelist,但我无法让它们中的任何一个工作。

有人能告诉我我对类型列表的理解是否正确,并给出一个简单的现实世界示例如何在日常平均代码中使用类型列表吗?提前致谢。

顺便说一句,我正在使用 Windows 和 Visual Studio 2005 及其编译器。

编辑:我的例子不见了,我在 vs 中使用了一个沙箱项目来测试这些东西。但它很安静,类似于 Dobbs 教程中的代码:

这行得通,但我没有看到能够做同样事情的继承的优势。动态转换不适用于原始类型。是否可以将其用作返回值,例如:

0 投票
3 回答
881 浏览

c++ - 基于策略的设计决策

我有一个名为Device的类,据我所知,它接受两个策略:StatePolicyBehaviorPolicy
StatePolicy保存和管理设备的状态。BehaviorPolicy
包装用 C 或 C++ 编写 的设备驱动程序。 现在我有两个问题:

  1. 国家政策与行为政策如何协调?
  2. 如何将所有设备存储在一个容器中?由于 Device<X, Y> 的类型与 Device<N, M> 不同,我无法将它们存储在一个容器中。

编辑1:这里有一些代码来说明我的问题:

编辑 2:这使得代码有一个缺点,我必须维护所有允许的状态类型的列表。在我看来,它有点像访客模式。有什么想法吗?

在此先感谢,
奥马尔。

0 投票
2 回答
807 浏览

c++ - 基于策略的设计和默认值

很难为这个问题想出一个好的标题。我真正需要的是能够提供具有不同数量参数的模板参数来代替单个参数。没有多大意义,所以我将讨论原因:

问题是,对于许多异常使用,Policy 将基于一个单一的类型 T,并且不能真正在 T 上进行参数化,因此将 T 作为参数是没有意义的。对于其他用途,包括默认用途,策略可以与任何 T 一起使用。

我有几个想法,但没有一个是真正的最爱。我认为我有一个更好的答案——使用组合而不是策略——但后来我意识到我有这种情况,其中 fun() 实际上需要类本身没有的额外信息。

这就像我第三次重构这个愚蠢的结构,并且我有很多自定义版本,我正试图整合它们。这次我想确定一些东西,而不是四处寻找,希望这次能奏效。所以我现在只是在寻找想法,希望有人有让我印象深刻的东西,我会转换神。有人有好主意吗?

编辑:您可能会问自己,为什么我不只是从基于 default_policy 模板的策略定义中检索 T。原因是 default_policy 实际上是专门针对某些类型 T 的。自从提出问题以来,我提出了一些可能是我需要的东西,这将随之而来,但我仍然可以使用其他一些想法。

编辑:仍在搞砸它。我不太喜欢上面的方法,因为它使 default_policy 与“test”永久结合,因此不能在其他方法中重用,例如下面建议的多个模板。它也根本无法扩展,并且至少与“测试”一样需要一个参数列表。尝试了几种不同的方法,但都失败了,直到我找到了另一种到目前为止似乎有效的方法:

0 投票
1 回答
876 浏览

java - Java 基于策略的设计

我有一个while循环,用户应该能够决定循环何时停止。x 秒后,x 次循环后,…… 这个问题应该按照基于策略的设计来实现。我知道如何在 C++ 中做到这一点,但不能让它在 Java 中工作。

我现在要做的是以下。

有一个 Auctioneer 类,其方法是“start()”,其中的策略应该适用:

public <E extends AbstractEndAuctionPolicy> void start(E policy) { //use policy here }

因为 AbstractEndAuctionPolicy 有方法“endAuction()”,我们可以做:policy.endAuction()。在 C++ 中,不需要“扩展 AbstractEndAuctionPolicy”...

但我不知道如何使用这种方法,以下不起作用:

this.auctioneer.start<NewBidPolicy>(n);

希望你们能帮助我并告诉我一些关于 Java 中基于策略的设计的信息,因为谷歌没有给我答案。

提前致谢。

0 投票
5 回答
633 浏览

c++ - C++11 模板,确定返回类型

我正在构建一个矩阵库,并且正在尝试使用基于策略的设计。所以我的基类是提供存储方法和一些访问功能的类。我还有一个提供数学函数的函数矩阵。这很好用,但是由于返回类型,operator* 存在一个主要问题。我将用一些代码来解释它。

提供堆栈存储的基类:

然后我有我的矩阵类,它提供了数学功能:

operator+始终有效,operator*仅适用于方阵。所以我们仍然需要一个用于所有矩阵的。这就是它出错了。我已经尝试了几件事,但没有任何效果。我在 c++0x 的帮助下寻找这样的东西(c++0x 的使用不是必需的)你会注意到“???” :)

问题的一个例子

在这里它会抱怨类型,因为它不匹配任何两个参数类型。但是编译器需要在编译时知道类型,我不知道如何提供它。

我知道设计还有其他选择,但我真的在为这种情况寻找解决方案..

谢谢 !

0 投票
2 回答
565 浏览

c++ - 多个类的父级的部分专业化

我想对模板类使用部分特化,以便该模板类的所有子级都使用该特化。让我用一个例子来解释:)

此类将具有指定矩阵结构的子级,例如稀疏,密集,对角线,..

然后这些类将再次具有指定存储的子类:堆栈数组,向量,列表,队列,..

然后是一个类 Matrix,它提供了所有的数学功能。这个模板类实现了operator+、operator-等...

对于最后一堂课,我想写这样的专业:

但是当我编写一个继承自 DiagonalMatrix 的 StackDiagonalMatrix 时,它没有找到 DiagonalMatrix 的特化——它实际上根本没有找到特化。

现在有解决这个问题的方法吗?你能为几个模板类的父类写一个特化吗?

非常感谢!

涉及的完整来源:

0 投票
1 回答
1398 浏览

c++ - 使用可变参数模板的基于策略的设计

我有一组同类策略类,我想将它们作为策略传递给一个模板类 PolicyDrivenClass,它采用一些未知数量的策略模板参数。

每个策略都实现了一个“名称”功能,我希望能够在运行时通过 PolicyDriveClass::getNames 查询所有策略的名称。

我有一个可行的实现,但感觉很笨拙,特别是考虑到在我的最终设计中,策略类将实现几个类似于“名称”的函数,尽管可能具有不同的返回类型,并且我的策略驱动类将希望提供类似的访问器为这些函数中的每一个“getNames”。

我的问题是是否有人可以为此提出更好的实施方案。

为了它的价值,我正在使用 clang++。我的 g++ 版本不喜欢这样。

这是我到目前为止所拥有的:

0 投票
1 回答
401 浏览

c++ - 基于 C++ 策略的设计....基类作为单例或不基于模板参数。

我班级的 OutputPolicy 有时会转到静态/单例对象,有时会转到 1 对 1 对象。

不确定我是否可以用英语解释..所以这是伪代码中所需的行为:

AlgoImp::OnData,做一些处理并调用NewMsg。我试图解耦 NewMsg() 调用的实现。

如果 OutputPolicy 是 OutMessageQueueTcp(上图),那么应该只有一个 OutputPolicy 实例。所以我要么必须从单例派生,要么在某处使用静态变量。

如果 OutputPolicy 是 OutMessageAsInput(上图),则输出将成为姊妹对象的输入,然后将发送到 OutMessageQueueTcp。

这里是主要的。

我想要的输出:

我真正拥有的是 AlgoImp 对象的集合,每个对象都有自己的主题和数据。AlgoImp 将通过调用 NewMsg 生成输出。有时这些消息应该发送到一个 Socket,有时它们应该由 AlgoImp2 处理。

这个决定将在编译时发生。会有很多 Algo 各自做不同的事情。好像我正在尝试做一些面向方面的东西。

问题:

是否可以通过将基类设为策略来使基类成为单例对象或普通对象?有这样的设计模式吗?也许是某种工厂?

谢谢您的帮助。