我已经阅读了很多机器学习的C ++和Java代码,其中每个隐藏层都在for循环中调用。为什么责任链模式从未使用过?它的缺点是什么?
- 经典方法:
std::vector<Layer> layers(10);
for(Layer& hidden : layers)
hidden.activation();
- 与责任链:
std::vector<Layer*> layers();
// ... init layers vector ...
layers[0]->nextLayer(layers[1]);
layers[1]->nextLayer(layers[2]);
layers[2]->nextLayer(layers[3]);
// and so on...
layers[0]->activation();
在图层中:
Layer::activation()
{
// do something
nextLayer->activation();
}
谢谢。
答案 0 :(得分:2)
for循环的优点是每次调用for循环时layers
集合可能不同。缺点&#39;是的,for循环保证在集合的每个项目上调用成员函数。
责任链模式可以进行“迭代”。通过集合,但很难更改集合,并必须更新项目之间的所有链接。另外,由于这是递归,你可能会出现堆栈溢出!
然而,在终止循环时,责任链真的很闪亮:任何成员都可以决定自己处理呼叫并立即返回,或者只是转发到下一个项目。
答案 1 :(得分:0)
为什么要通过创建列表并调用它来简化简单代码&#34;责任链&#34;?
std::vector<Layer> layers(10);
for(Layer& hidden : layers)
{
// prepare for activation aka do something
hidden.activation();
}
你对此方法不喜欢什么?
答案 2 :(得分:0)
第一个例子;每一层完全独立于下一层。这意味着他们对其他层一无所知 - 它们可能存在也可能不存在;并且只需要专注于单一的责任。
第二个;这些图层现在不仅知道有其他图层,而且还知道它是一个链表。如果第2层和第3层彼此独立但仅依赖于1,该怎么办?表示失败的能力。最终,控制图层的项目不再具有以任何方式存储它们的能力,导致它是一个糟糕的设计,因为它正在朝向上帝对象。