我正在寻找关于解耦以后延伸依赖关系的代码案例的建议。我们假设我的应用程序有两种对象:房间和家具。一个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
。