带有数组的c++装饰器模式实现
C++ Decorator Pattern implementation with Arrays
我在c++中实现了如下的Decorator模式:
#include <iostream>
#include <string>
#include <deque>
using namespace std;
// Abstract Component
template <class T>
class IArray
{
public:
virtual void insert(const T&) = 0;
virtual ~IArray(){}
};
// Concrete Component
template <class T>
class Array : public IArray<T>
{
public:
virtual void insert(const T& elem)
{
m_array.push_back(elem);
}
private:
deque<T> m_array;
};
// Decorator 1
template <class T>
class PositiveArray : public IArray<T>
{
public:
PositiveArray(IArray<T>* component):m_component(component)
{
}
virtual void insert(const T& elem)
{
if (elem > 0)
{
m_component->insert(elem);
}
else
{
cerr << "You can't insert non-positive number." <<endl;
}
}
private:
IArray<T>* m_component;
};
// Decorator 2
template <class T>
class PrintArray : public IArray<T>
{
public:
PrintArray(IArray<T>* component):m_component(component)
{
}
virtual void insert(const T& elem)
{
m_component->insert(elem);
cout << "Element " << elem << " was inserted into the array." <<endl;
}
private:
IArray<T>* m_component;
};
// Client
int main()
{
typedef int MyType;
PositiveArray<MyType> arr(new PrintArray<MyType>(new Array<MyType>));
arr.insert(10);
arr.insert(-10);
int i;
cin>>i;
return 0;
}
现在我想要所有数组的printArray
函数。我应该把它写为IArray中的纯虚函数,并在IArray的每个子函数中复制该函数的以下实现吗?
void printArray()
{
for (int i = 0; i < m_array.size(); ++i)
{
cout << "elem " <<i << " is " << m_array[i] <<endl;
}
}
有什么办法可以避免复制吗?
我将在Array
中实现for_each_element
,并在IArray
中公开接口。它有2个超载,采取std::function< void(T const&) >
和std::function< void(T) >
(第二个是可选的)。现在PrintArray
是一个单行lambda函数。
在c++ 03中,你可以使用boost::function
,而PrintArray
写起来比较麻烦。所以这里就没那么诱人了。
作为另一种方法,将const_iterator
s暴露给底层数据。
说句题外话,deque
的性能出奇的差。到目前为止,你的代码中没有任何东西会让我认为你不能使用std::vector
。如果您保证内存的连续性,您甚至可以将const_iterator
设置为T const*
,并直接从IArray
公开接口(在Array
中实现)。for_each_element
在c++ 11中变成了两行代码,而PrintArray
即使没有c++ 11或for_each_element
也是两行代码,并且要么在IArray
中内联实现,要么作为一个自由函数。
哦,我想让PrintArray
成为一个自由函数而不是成员函数。for_each_element
可能需要是一个成员函数,但是一旦你公开了迭代器和/或for_each_element
,你应该能够在不访问私有数据的情况下访问PrintArray
。
- 下面抽象工厂设计模式的实现是正确的吗
- 虚拟模板函数:使用参数实现访客模式
- OpenCV 混合模式实现:为什么看似等效的操作会产生不同的结果?
- 为什么装饰器模式实现需要一个具有核心类的公共抽象超类
- 奇怪的是重复出现的模板模式实现
- 生成器模式实现中的不完整类型错误
- 我的双重检查锁定模式实现是否正确?
- 使用具有返回值的访客模式实现 AST 的最佳方法是什么?
- 使用桥接模式 c++ 实现复制构造函数
- 通过双重检查锁定模式实现call_once
- C++ 状态模式实现:指向状态机的指针机制变得无效
- 为什么GoF建议在C++模板方法模式实现中使用受保护的(而不是私有的)虚拟方法
- 如何在装饰器模式实现中正确使用shared_ptr
- C++中Observer模式实现中的循环引用
- c++单例模式_实现和内存管理
- 单例模式实现错误
- 如何使用复合模式实现菜单
- 带有数组的c++装饰器模式实现
- 这个工厂模式实现有什么问题吗?
- 使用策略设计模式实现输入类