添加扩展功能但保持代码松散耦合

时间:2013-11-08 18:04:48

标签: php oop dependency-injection refactoring

我正在寻找关于解耦以后延伸依赖关系的代码案例的建议。我们假设我的应用程序有两种对象:房间和家具。一个Room对象有许多Furniture个对象。有Client谁通过Factory创建它们。以下示例有意无定义依赖注入,代码紧密耦合。 (所以认为这是一个不好的例子。)我正在寻找改善这种逻辑的建议。

class Room { 
    public function __construct( $params );
    public function insert_to_master_plan();
}
class Furniture { 
    public function __construct( $params );
    public function place_in( Room $room );
}
class Client {
    public function create_room_with_furniture( $room_params, $furniture_params_array) {
         $factory = new Room_And_Furniture_Factory;
         $factory->create_room_with_furniture( $room_params, $furniture_params_array );
    }
}
class Room_And_Furniture_Factory {
     public function create_room_with_furniture( $room_params, $furniture_params_array ) {
        $room = new Room( $room_params );
        foreach( $furniture_params_array as $furniture_params ) {
            $furniture = new Furniture( $furniture_params );
            $furniture->place_in( $room );
        }
        $room->insert_to_master_plan();
    }
}

现在,我想为房间添加新功能。功能可以这样描述:

class Finished_Room extends Room {
    public function insert_to_master_plan() {
        $room_finisher = new Room_Finisher;
        $room_finisher->set_options( $particular_taste );
        $room_finisher->add_a_touch_of_style( $this );
        return parent::insert_to_master_plan();
    }
}

因此,扩展类引入了一个新的依赖项Room_Finisher类。

问题是:如何在不修改客户端API方法create_room_with_furniture的情况下实现解耦此代码,引入使用客户端创建Finished_Rooms和Rooms的可能性?请考虑必须根据某些用户选项配置Room_Finisher类的事实。

一个明显的解决方案是编写一个新的Finished_Room_Factory并使用标准依赖注入将新工厂设置为客户端中的属性,但该解决方案似乎不必扩展Room首先,由于可以在Finished_Room_Factory内部实现相同的功能,因此可以单独调用Room_Finisher

0 个答案:

没有答案