Corak Struktur: Adapter, Decorator, Facade
Gubah objek dan permudahkan interface dengan corak struktur.
Corak Struktur: Adapter, Decorator, Facade ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Menggabungkan objek
Corak struktur menerangkan cara menggabungkan kelas dan objek menjadi struktur yang lebih besar sambil mengekalkannya fleksibel. Kita membincangkan tiga corak utama:
- Penyesuai — menjadikan antara muka yang tidak serasi boleh digunakan.
- Penghias — menambah tingkah laku tanpa mensubkelas.
- Fasad — menyediakan muka hadapan ringkas untuk subsistem kompleks.
Penyesuai: masalahnya
Anda bergantung pada antara muka PaymentGateway, tetapi SDK pihak ketiga mendedahkan chargeCard($amountInCents) dengan bentuk yang berbeza. Memanggil SDK secara terus menyebarkan antara muka aplikasinya ke seluruh kod. Di bawah, kedua-dua antara muka jelas tidak serasi — ketidakpadanan inilah yang diselesaikan oleh penyesuai.
<?php
// What our app wants to depend on
interface PaymentGateway { public function pay(float $dollars): string; }
// What the vendor actually gives us (cents, array result)
final class StripeSdk {
public function chargeCard(int $cents): array {
return ['id' => 'ch_1', 'amount' => $cents];
}
}
// dollars vs cents, string vs array -> shapes don't line up
var_dump((new StripeSdk())->chargeCard(2000));
Penyesuai dalam kod
Penyesuai menyimpan objek yang disesuaikan dan melaksanakan antara muka sasaran anda, dengan menukar argumen serta nilai pulangan. Kod aplikasi anda kekal bersih dan tidak bergantung pada pembekal.
<?php
interface PaymentGateway { public function pay(float $dollars): string; }
// Third-party SDK with an incompatible API
final class StripeSdk {
public function chargeCard(int $cents): array {
return ['id' => 'ch_1', 'amount' => $cents];
}
}
final class StripeAdapter implements PaymentGateway {
public function __construct(private StripeSdk $sdk) {}
public function pay(float $dollars): string {
$res = $this->sdk->chargeCard((int) round($dollars * 100));
return "charged {$res['amount']}c -> {$res['id']}";
}
}
echo (new StripeAdapter(new StripeSdk()))->pay(20.0), PHP_EOL;
Penghias: gagasannya
Penghias membalut objek yang berkongsi antara mukanya dan menambah tingkah laku sebelum atau selepas penyerahan tugas. Berbeza daripada pewarisan, penghias boleh ditindan pada masa jalan, membolehkan anda menggabungkan ciri mengikut sebarang urutan tanpa ledakan kelas. Berikut ialah rangka asas minimum: pembalut yang melaksanakan antara muka yang sama dan menyimpan instans dalaman.
<?php
interface Coffee { public function cost(): float; }
final class Espresso implements Coffee {
public function cost(): float { return 2.0; }
}
final class WithMilk implements Coffee {
public function __construct(private Coffee $inner) {}
public function cost(): float { return $this->inner->cost() + 0.5; }
}
echo (new WithMilk(new Espresso()))->cost(), PHP_EOL; // 2.5
Penghias dalam kod
Setiap penghias melaksanakan antara muka yang sama dan menyimpan instans dalaman. Di sini kita membalut sumber data dengan penyimpanan sementara dan pengelogan, lalu menggabungkannya secara bebas.
<?php
interface DataSource { public function read(): string; }
final class FileSource implements DataSource {
public function read(): string { return 'raw-data'; }
}
final class UpperCaseDecorator implements DataSource {
public function __construct(private DataSource $inner) {}
public function read(): string { return strtoupper($this->inner->read()); }
}
final class ExclaimDecorator implements DataSource {
public function __construct(private DataSource $inner) {}
public function read(): string { return $this->inner->read() . '!!!'; }
}
$src = new ExclaimDecorator(new UpperCaseDecorator(new FileSource()));
echo $src->read(), PHP_EOL; // RAW-DATA!!!
Penghias dalam penggunaan sebenar
Perisian tengah PSR-7 / PSR-15 pada asasnya ialah corak penghias yang diterapkan pada pengendalian HTTP: setiap perisian tengah membalut perisian tengah seterusnya, lalu menambah pengesahan, pengelogan atau penyimpanan sementara di sekeliling permintaan dan respons. Pembalut strim serta lapisan penyimpanan sementara PSR-6/16 juga lazimnya menggunakan penghiasan. Ciri utamanya: pembalut boleh menggantikan perkara yang dibalutnya.
Penghias berbanding pewarisan
Pewarisan menetapkan tingkah laku semasa kompilasi dan hanya membenarkan satu kelas asas. Penghiasan bersifat dinamik dan boleh digubah. Pilih penghias apabila:
- gabungan ciri pilihan semakin berlipat ganda,
- tingkah laku perlu ditambah atau dibuang pada masa jalan,
- anda mesti melanjutkan kelas
finalatau kelas pihak ketiga yang tidak boleh anda subkelas.
Fasad: gagasannya
Fasad menyediakan satu titik masuk yang ringkas kepada subsistem kompleks yang terdiri daripada banyak kelas. Ia tidak menyembunyikan subsistem tersebut (anda masih boleh mengaksesnya secara langsung), tetapi menawarkan antara muka pengaturcaraan aplikasi peringkat tinggi yang mudah untuk kes biasa. Bandingkan urutan interaksi subsistem yang panjang di bawah dengan panggilan fasad satu baris dalam babak seterusnya.
<?php
// Without a facade, the client wires every step itself
final class Cpu { public function boot(): string { return 'cpu '; } }
final class Disk { public function load(): string { return 'disk '; } }
final class Ram { public function check(): string { return 'ram'; } }
$out = (new Cpu())->boot() . (new Disk())->load() . (new Ram())->check();
echo $out, PHP_EOL; // cpu disk ram
Fasad dalam kod
Fasad menyelaraskan beberapa komponen kerjasama di sebalik satu kaedah. Klien memanggil place() dan bukannya menyambungkan sendiri inventori, pembayaran serta penghantaran.
<?php
final class Inventory { public function reserve(string $sku): bool { return true; } }
final class Payments { public function charge(float $amt): bool { return true; } }
final class Shipping { public function dispatch(string $sku): string { return 'tracking-99'; } }
final class OrderFacade {
public function __construct(
private Inventory $inv,
private Payments $pay,
private Shipping $ship
) {}
public function place(string $sku, float $amount): string {
if (!$this->inv->reserve($sku)) { return 'out of stock'; }
if (!$this->pay->charge($amount)) { return 'payment failed'; }
return 'shipped: ' . $this->ship->dispatch($sku);
}
}
echo (new OrderFacade(new Inventory(), new Payments(), new Shipping()))
->place('ABC', 49.99), PHP_EOL;
Membezakan ketiga-tiganya
- Penyesuai mengubah antara muka supaya dua bahagian sedia ada boleh berkomunikasi; tingkah laku sama, bentuk berbeza.
- Penghias mengekalkan antara muka tetapi menambah tingkah laku, dan boleh ditindan pada masa jalan.
- Fasad memperkenalkan antara muka baharu yang lebih ringkas di hadapan banyak kelas.
Ujian yang mudah diingati: Penyesuai berkaitan dengan keserasian, Penghias dengan penambahbaikan, dan Fasad dengan pemudahan.
Nota tentang fasad Laravel
"Fasad" Laravel ialah mekanisme proksi statik yang disokong oleh bekas perkhidmatan, bukannya corak Fasad Kumpulan Empat. Kedua-duanya berkongsi matlamat untuk menyediakan muka hadapan yang mudah, tetapi pelaksanaannya berbeza. Jangan samakan istilah rangka kerja dengan corak struktur apabila menaakul tentang reka bentuk.
Semakan Pantas
Kenal pasti corak berdasarkan tujuannya.
Imbas Kembali
Anda menggabungkan objek dengan tiga corak struktur: Penyesuai untuk merapatkan antara muka yang tidak serasi (contohnya, SDK pembekal), Penghias untuk menindan tingkah laku pada masa jalan (asas kepada perisian tengah PSR-15), dan Fasad untuk menyediakan muka hadapan ringkas kepada subsistem kompleks. Setiap satunya mengurangkan gandingan supaya kod anda tahan terhadap kebergantungan pada satu pembekal dan lambakan ciri.
Pelajari PHP dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Soalan Lazim
Adakah pelajaran “Corak Struktur: Adapter, Decorator, Facade” percuma?
Ya — teks penuh “Corak Struktur: Adapter, Decorator, Facade” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Corak Struktur: Adapter, Decorator, Facade”?
Gubah objek dan permudahkan interface dengan corak struktur. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Corak Struktur: Adapter, Decorator, Facade” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Prinsip SOLID dalam Amalan
- Corak Penciptaan: Factory, Builder, Singleton
- Corak Struktur: Adapter, Decorator, Facade
- Corak Tingkah Laku: Strategy, Observer, Command