Saya memiliki antarmuka yang memiliki sejumlah fungsionalitas yang terdefinisi dengan baik. Katakanlah:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Ini berfungsi dengan baik untuk sebagian besar implementasi antarmuka, tetapi dalam beberapa kasus, saya perlu menambahkan beberapa fungsi baru (seperti mungkin digulirkan ke metode baru, createBrownies()
). Pendekatan yang jelas / naif untuk melakukan ini adalah memperluas antarmuka:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Tetapi memiliki kelemahan yang cukup besar karena saya tidak dapat menambahkan fungsionalitas baru tanpa memodifikasi API yang ada (seperti mengubah kelas untuk menggunakan antarmuka baru).
Saya sedang berpikir tentang menggunakan adaptor untuk menambah fungsionalitas setelah instantiation:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Yang akan memberi saya sesuatu seperti:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Ini sepertinya solusi yang bagus untuk masalah ini, tetapi saya bertanya-tanya apakah saya membangunkan dewa-dewa lama dengan melakukannya. Apakah adaptor bisa digunakan? Apakah ada pola yang lebih baik untuk diikuti? Atau haruskah saya benar-benar menggigit peluru dan hanya memperluas antarmuka asli?