Php 如何从类型定义的特定类或属性中进行选择?
我需要创建一个具有多态对象的系统 每种类型的对象都应该由特定的处理程序处理,因此我需要确定正确处理它的类型 我想知道什么是最好的设计决策:Php 如何从类型定义的特定类或属性中进行选择?,php,oop,design-patterns,Php,Oop,Design Patterns,我需要创建一个具有多态对象的系统 每种类型的对象都应该由特定的处理程序处理,因此我需要确定正确处理它的类型 我想知道什么是最好的设计决策: 创建一个抽象基类,比如ObjectBase,然后扩展到特定的 对象,如CustomObjectA和CustomObjectB 创建一个泛型对象GenericObject,并使用传递给构造函数的$type属性(类型应该是不可变的) 请注意,对象没有区别,只是处理它们的方式不同,我的意思是,在它们的行为中没有添加属性、方法或任何东西 有什么反馈吗 编辑:
- 创建一个抽象基类,比如
,然后扩展到特定的 对象,如ObjectBase
和CustomObjectA
CustomObjectB
- 创建一个泛型对象
,并使用传递给构造函数的GenericObject
属性(类型应该是不可变的)$type
编辑: 第一种解决方案
abstract class ObjectBase {}
class CustomObjectA extends ObjectBase {}
class HandlerManager {
public function process(ObjectBase $object) {
if ($object instanceof CustomObjectA) {
$customObjectAHandler->process($object);
}
}
}
第二种解决方案
class GenericObject {
protected $type;
public function __construct($type)
{
$this->type = $type;
}
}
class ObjectTypeAHandler {
public function process(GenericObject) {
}
public function supportsType(GenericObject $object)
{
return 'typeA' === $object->getType();
}
}
class HandlerManager {
public function process(GenericObject $object) {
if ($customObjectAHandler->supportType($object)) {
$customObjectAHandler->process($object);
}
}
}
让所有处理程序共享一个基类。让对象使用基类上抽象的工厂方法创建正确的处理程序。我建议您使用第一种方法。创建两个没有body的对象并不难,但是如果你想在将来改变它们的行为,你将有很多事情要做。我不认为处理程序应该设置在对象级别,它应该知道它的处理程序,这违反了OOP的许多规则(参见SOLID)ImhoI认为我不清楚:我的建议是抽象工厂模式的变体,只有对象也扮演abstrat工厂的角色。没有理由改变行为,顺便说一句,第二种解决方案并不禁止您扩展对象以进行自定义,因为基类总是匹配的