我使用SplObjectStorage实现了一个简单的Composite模式,就像上面的例子一样:
class Node
{
private $parent = null;
public function setParent(Composite $parent)
{
$this->parent = $parent;
}
}
class Composite extends Node
{
private $children;
public function __construct()
{
$this->children = new SplObjectStorage;
}
public function add(Node $node)
{
$this->children->attach($node);
$node->setParent($this);
}
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试序列化一个Composite对象时,PHP 5.3.2就会抛出一个Segmentation Fault.只有在向对象添加任意类型的任意数量的节点时才会发生这种情况.
这是违规的代码:
$node = new Node;
$composite = new Composite;
$composite->add($node);
echo serialize($composite);
Run Code Online (Sandbox Code Playgroud)
虽然这个有效:
$node = new Node;
$composite = new Composite;
echo serialize($composite);
Run Code Online (Sandbox Code Playgroud)
另外,如果我使用array()而不是SplObjectStorage实现Composite模式,那么所有运行也都可以.
我做错了什么?
似乎Proxy和Adapter模式之间有相似之处?
任何人都可以解释一下有什么区别吗?为什么我们要求他们两个?在哪些问题中我们应该只使用代理而不是另一个.net示例?
谢谢
我正准备第一次自己设置teamcity.我不得不说,在很多方面非常好看和简单.但是,我有一个问题,我无法解决并找到任何相关信息.
当我想发布我的工件时,我想要排除一些文件类型.
例:
%system.agent.work.dir%\trunk\Source\Projects\Webproject.Web/Controllers => Webproject.Web/Controllers
Run Code Online (Sandbox Code Playgroud)
但是,我不想复制文件夹中的所有.cs文件.我只需要文件夹.是否可以只复制文件夹而不是内容,然后复制我需要的内容?或者,如果我复制目录,我可以排除文件吗?
我正在学习国家设计模式.我正在使用C#ASP.Net(不确定语言是否相关).
基本上,我的对象有状态A,B和C,也行动不同状态之间移动:ActionAToB,ActionBtoA和ActionAtoC.
我想要做的是将这个对象绑定到一个屏幕,并让按钮触发这些操作,但问题是:我如何只显示与对象所处状态相关的按钮,并在状态时显示/隐藏按钮变化?
我正在寻找一个优雅的解决方案,与状态模式,或任何建议,使UI易于维护.
假设这样的结构:
class Interface
{
public:
template <typename T>
virtual void reportOperationError(T code , std::string message) = 0;
};
Run Code Online (Sandbox Code Playgroud)
我不明白这个东西的用例,在这种情况下它是有用的,怎么样?
万一你想知道,我没有在任何地方看到这个代码,只是想了解这是否有一些特殊用途
当我想使用模板方法模式时,我经常遇到这种情况,但模板方法需要不同类型的参数,如下所示:
public abstract class AbstractFoo {
public void process(TypeA a, TypeB b) {
//do common processing
if (b == null) {
doProcess(a);
} else if(a == null) {
doProcess(b);
}
}
public abstract void doProcess(TypeA a);
public abstract void doProcess(TypeB b);
}
Run Code Online (Sandbox Code Playgroud)
这看起来不太好。提供的参数之一必须为 null,并且所有服务都必须为其他类型实现虚拟 doProcess 方法。有没有更好的模式呢?你如何处理这个问题?我不想使用构造函数,因为这些服务是 spring bean。同样的问题也适用于策略模式。
我读过有关SOLID的文章但我没有看到OCP和DIP之间有任何区别.看看这个OCP的例子:
http://www.oodesign.com/open-close-principle.html
Run Code Online (Sandbox Code Playgroud)
持有OCP的代码也满足DIP.任何人都可以给我一个持有OCP但不是DIP的代码示例吗?
oop design-patterns open-closed-principle solid-principles dependency-inversion
在设计模式 - 可重用面向对象软件的元素书中说:
在只有一个实现(一对一)的情况下,创建一个抽象的实现者类是没有必要的.这是桥模式的退化情况; Abstraction和Implementor之间存在一对一的关系.然而,当类的实现中的更改不得影响其现有客户端时,这种分离仍然有用 - 即它们不应该被重新编译,只需重新链接.
我对编译时间的好处表示怀疑,因为我无法想象Java中的一个案例,即实现中的更改会重新编译其超类(在本例中为abstract).
例如,如果我们有X扩展Y并且客户端执行:
Y y = new X();
Run Code Online (Sandbox Code Playgroud)
X中的更改并不意味着重新编译Y(当然,如果我们不想更改X的方法签名)
使用Bridge Pattern时完全相同:
YAbstraction yabstraction = new YRefinedAbstraction(new XImplementor());
Run Code Online (Sandbox Code Playgroud)
XImplementor中的更改并不意味着重新编译YAbstraction.
因此,根据我的说法,这种好处不会发生在Java中,并且需要一对一=>无桥模式.
也许子类强制超类的更改要在其他语言中重新编译?喜欢SmallTalk和C++?
你有什么看法?
我找到了一种在TeamCity中更改属性的方法:
##teamcity[setParameter name='ddd' value='fff']
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这种变化只发生在当前版本中.我希望此更改为PERMANENT,但TeamCity仅针对当前正在运行的构建更改此更改.
如何对TeamCity中的系统属性进行永久性更改?