- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 vector 和几个类(位于单独的文件中)来修改一个。
我想全局访问 std::vector
,但仅限于派生类当每次调用存储前一个和最后一个对象的结果时,应该返回总结果
您能解释一下如何使用带有 std::vector
的装饰器模式构建高性能界面吗?
我可能错了,可能需要其他模式。
// A.h
class A () {
public :
vector<int> set(vector<int> &vec);
//return total result
vector<int> get() {
return vector;
}
};
// B.h
class B () {
//add new elements into vector
//for example, add 2,3,4
};
// C.h
class C () {
//remove some elements from vector
//for example, remove last element
};
//...
// main.cpp
#include "A.h"
#include "B.h"
#include "C.h"
int main () {
vector<int> set;
set.push_back(1); //1
C obj(new B(new A()));
obj.set(set);
obj.get(); // stores 1,2,3 (added by classes A, B, C)
}
所以,我不想这样做:
vector<int> set1;
set1.push_back(1);
A *A_init;
A_init->set(set1); //add 1
vector<int> set2 = A_init->get();
B *B_init;
B_init->set(set2); //add 2, stores 1,2
vector<int> set3 = B_init->get();
C *C_init;
C_init->set(set3); //add 3, stores 1,2,3
vector<int> set4 = C_init->get();
/..
我想这样做:
vector<int> set;
set.push_back(1);
C obj(new B(new A()));
obj.set(set);
obj.get(); // stores 1,2,3
我有一个模式装饰器的简单实现。
但这不是我所需要的((
#include <iostream>
#include <memory>
class A {
public:
virtual void operation() = 0;
};
class Component : public A {
public:
virtual void operation() {
std::cout<<"World!"<<std::endl;
}
};
class B : public A {
std::unique_ptr<A> add;
public:
B(A *component): add(component) {}
virtual void operation() {
std::cout << ", ";
add->operation();
}
};
class C : public A {
std::unique_ptr<A> add;
public:
C(A *component): add(component) {}
virtual void operation() {
std::cout << "Hello";
add->operation();
}
};
int main() {
C obj(new B(new Component()));
obj.operation(); // prints "Hello, World!\n"
return 0;
}
附言:抱歉解释的不是很清楚,因为我不太懂英语
最佳答案
根据您的描述,Decorator 不是要查看的模式。
在我看来,您只是想设置一个转换器链来对一个公共(public) vector 进行操作——即一个简单的功能组合。这在与核心对象的关系方面不同于 Decorator - 你不是在构建一些东西来代替 vector ,而是在构建一些东西来对其进行操作。现在当你使用多个转换器时,理论上你可以将第二个和后面的转换器想象成第一个的装饰器,但考虑到所涉及对象的简单性,尝试将 GoF 装饰器实现应用到你的情况可能是会矫枉过正。
你可以通过做这样的事情来接吻:
#include <vector>
using namespace std;
typedef vector<int> ivec;
ivec& a(ivec& v) {
v.push_back(1);
return v;
}
ivec& b(ivec& v) {
v.push_back(2);
v.push_back(3);
v.push_back(4);
return v;
}
ivec& c(ivec& v) {
v.pop_back();
return v;
}
共有三个简单的转换函数,每个函数的编写方式都可以将一个函数的输出直接输入到下一个函数的输入中。然后你可以这样做:
ivec& xform(ivec& v) {
return c(b(a(v)));
}
ivec v;
xform(v);
如果您只想静态构建最终转换并应用它。
作为替代实现,假设您想要动态构建一组转换器。在这种情况下,您可以将函数推送到转换器 vector 中并一个一个地应用它们:
#include <vector>
using namespace std;
typedef ivec& (*ivec_xformer)(ivec&);
typedef vector<ivec_xformer> xform_vec;
xform_vec xforms;
xforms.add(&a);
xforms.add(&b);
xforms.add(&c);
ivec v;
for (xform_vec::iterator i = xforms.begin(); i != xforms.end(); ++i) {
(*i)(v);
}
顺便说一句,如果您愿意,可以使用 boost::bind
和 std::for_each
进一步“简化”这个循环。
转换器的动态链与责任链有些相似,除了没有让特定对象通过“处理”请求来停止链的概念,即没有真正的责任 与此解决方案相关联——每个函数在 vector 上得到平等的破解。我建议这种模式需要一个更好的名称——一个可能已经存在的名称,因为这种函数组合在 OO 编程中并不少见,但目前我还没有想到。
关于C++ 装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764247/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!