ฉันมีอินเทอร์เฟซที่มีฟังก์ชันการทำงานที่กำหนดไว้จำนวนหนึ่ง สมมติว่า:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
สิ่งนี้ทำงานได้ดีสำหรับการนำไปใช้งานส่วนใหญ่ของอินเทอร์เฟซ แต่ในบางกรณีฉันต้องเพิ่มฟังก์ชันใหม่บางอย่าง (เช่นอาจรีดเป็นวิธีใหม่createBrownies()
) วิธีการที่ชัดเจน / ไร้เดียงสาในการทำเช่นนี้คือการขยายส่วนต่อประสาน:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
แต่มีข้อเสียใหญ่ที่ฉันไม่สามารถเพิ่มฟังก์ชั่นใหม่โดยไม่ต้องปรับเปลี่ยน API ที่มีอยู่ (เช่นการเปลี่ยนคลาสเพื่อใช้อินเทอร์เฟซใหม่)
ฉันกำลังคิดเกี่ยวกับการใช้อะแดปเตอร์เพื่อเพิ่มฟังก์ชันการทำงานหลังจาก instantiation:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
ซึ่งจะทำให้ฉันชอบ:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
ดูเหมือนว่าจะเป็นทางออกที่ดีสำหรับปัญหา แต่ฉันสงสัยว่าถ้าฉันตื่นขึ้นมาพระเจ้าเก่าด้วยการทำมัน อะแดปเตอร์เป็นวิธีที่จะไป? มีรูปแบบที่ดีกว่าในการติดตาม? หรือฉันควรจะกัดกระสุนและแค่ขยายส่วนต่อประสานดั้งเดิม?