Tôi có một giao diện có một số chức năng nhất định được xác định rõ. Hãy cùng nói nào:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Điều này hoạt động tốt cho hầu hết các cài đặt của giao diện, nhưng trong một vài trường hợp, tôi cần thêm một số chức năng mới (như có lẽ được đưa vào một phương thức mới, createBrownies()
). Cách tiếp cận rõ ràng / ngây thơ để làm điều này sẽ là mở rộng giao diện:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Nhưng có một nhược điểm khá lớn là tôi không thể thêm chức năng mới mà không sửa đổi API hiện có (như thay đổi lớp để sử dụng giao diện mới).
Tôi đã suy nghĩ về việc sử dụng một bộ chuyển đổi để thêm chức năng sau khi khởi tạo:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Mà sẽ net cho tôi một cái gì đó như:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Đây có vẻ là một giải pháp tốt cho vấn đề, nhưng tôi tự hỏi liệu tôi có đánh thức các vị thần cũ bằng cách làm điều đó không. Là bộ chuyển đổi con đường để đi? Có một mô hình tốt hơn để làm theo? Hay tôi thực sự chỉ nên cắn viên đạn và chỉ mở rộng giao diện ban đầu?