对于没有类爆炸的选择性组合物的良好物体结

jon*_*tyc 9 php java oop

我的真实场景有点难以解释,因此我将它映射到一个更易识别的领域,比如家庭娱乐设备:

特定设备可以提供不同的服务:

Panasonic XYZ可以播放DVD和CD.
索尼ABC只能播放CD.
Hitachi PQR可以播放DVD并接收电视.
...
...

每项服务(DVD,CD,TV,......)都有一个大多数模型使用的默认实现,但某些模型具有特定服务的定制版本.


接口

选择实现DVD',CD',TV'izable,...合同的模型将导致模型之间的大量代码重复.


单一继承

实现默认服务的单个超类允许我为每个模型包含一个包含其所有自定义行为的子类.然而,对于不提供所有类型服务的模型,我的超类将非常笨重且比它需要的更重.


多重继承

在表面上具有选择性地整合所需服务并提供默认实现的能力的多重继承似乎是理想的.我重视将所有PanasonicXYZ的自定义功能集中在一个类中的内聚性,而不是继承所引入的耦合.

但我不是在使用C++(而是使用PHP),我觉得有一种更好的方法.我也不想使用mixins或5.4的特性等专有扩展.


组成

我看到一个类爆炸,我的自定义功能分散在多个类的特定模型上 - 例如,我需要PanasonicXYZ_CD类和PanasonicXYZ_DVD类,它们只能被PanasonicXYZ对象使用.


有更好的结构吗?

编辑:我会很好地思考一些评论和答案,而不是过早评论.

str*_*str 0

我会使用依赖注入来做这样的事情:

abstract class Device {
    private function addFunction(Function $function)
    {
        // store it
    }
    public function callFunction($function, $method)
    {
        // check whether local method exists (e.g. $function$method() or dvdPlay())
        // if not: call $function->$method
    }
}
Run Code Online (Sandbox Code Playgroud)

然后所有设备都扩展Devices,所有功能都扩展Function。要更改默认Function实现,您的设备类(例如 SonyAbc)可以为例如dvdPlay().