Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Corak Penghias: Melancarkan Kuasa Corak Reka Bentuk

Corak Penghias: Melancarkan Kuasa Corak Reka Bentuk

WBOY
WBOYasal
2023-09-04 21:01:08909semak imbas

Corak Penghias: Melancarkan Kuasa Corak Reka Bentuk

Terdahulu dalam siri ini, kami meneroka corak reka bentuk fasad dan penyesuai dalam siri ini. Menggunakan Facade, kami boleh memudahkan sistem yang besar dan dengan melaksanakan penyesuai kami boleh kekal selamat apabila menggunakan API dan kelas luaran. Sekarang kami akan memperkenalkan corak reka bentuk penghias, yang juga termasuk dalam kategori corak struktur.

Apabila kita hanya ingin memberikan beberapa tanggungjawab tambahan kepada kelas asas, kita boleh menggunakan corak penghias. Corak reka bentuk ini adalah alternatif yang bagus untuk mensubkelaskan fungsi, melanjutkan fungsi dan mempunyai beberapa kelebihan tambahan.

Soalan

Jika anda keliru dan berfikir bahawa kita boleh mencapai kefungsian yang sama dengan mensubkelaskan fungsi juga, maka izinkan saya menunjukkan kepada anda beberapa contoh kod yang akan mengosongkan kekeliruan anda dan membuatkan anda menyukai corak penghias.

Saya akan memberikan contoh kelas yang bertanggungjawab menjana kandungan e-mel. Dalam blok kod seterusnya, seperti yang anda lihat, kelas ini menjana kandungan e-mel dengan baik tanpa sebarang pengubahsuaian.

class eMailBody {
    private $header = 'This is email header';
	private $footer = 'This is email Footer';
	public $body = '';

	public function loadBody() {
		$this->body .= "This is Main Email body.<br />";
	}
}

Kami tahu Krismas akan tiba, jadi andaikan saya ingin mengucapkan salam kepada pembaca saya dalam e-mel surat berita saya yang seterusnya. Jadi saya perlu menambah mesej dalam badan e-mel dengan imej yang kelihatan baik.

Untuk ini, saya boleh mengedit terus dalam kelas e-mel saya, tetapi saya benar-benar tidak mahu berbuat demikian. Jadi saya boleh melaksanakan warisan untuk mencapai kesan yang sama. Saya mencipta subkelas berasingan bagi kelas badan e-mel utama:

class christmasEmail extends eMailBody {
    public function loadBody() {
		parent::loadBody();
		$this->body .= "Added Content for Xmas<br />";
	}
}

$christmasEmail = new christmasEmail();
$christmasEmail->loadBody();
echo $christmasEmail->body;

Jadi saya menyelesaikan kod saya dan selepas beberapa hari saya ingin menghantar e-mel dengan ucapan selamat tahun baru. Kita boleh menggunakan pendekatan yang sama seperti Krismas.

class newYearEmail extends eMailBody {
    public function loadBody() {
		parent::loadBody();
		$this->body .= "Added Content for New Year<br />";
	}
}

$newYearEmail = new newYearEmail();
$newYearEmail->loadBody();
echo $newYearEmail->body;

Semuanya berjalan lancar tanpa sebarang masalah. Sekarang, katakan saya terlupa untuk menyambut pelawat saya pada dua majlis ini (Krismas dan Tahun Baru) dan saya ingin menghantar kedua-dua ucapan dalam satu e-mel tanpa mengubah suai sebarang kod dalam kelas asas.

Fikiran anda segera dipenuhi dengan soalan berikut: Adakah subkelas dan warisan membantu di sini? Saya memihak untuk melakukan ini, tetapi kita perlu menggunakan kod tambahan/tidak perlu untuk mencapai ini. Kita boleh menggunakan ciri untuk mencapai sesuatu yang serupa dengan pewarisan berbilang.

Penyelesaian

Masalah yang kita bincangkan di bahagian sebelumnya boleh diselesaikan dengan melaksanakan corak penghias.

Menurut Wikipedia:

Corak Penghias (juga dikenali sebagai Wrapper, tatanama alternatif yang dikongsi dengan corak Penyesuai) ialah corak reka bentuk yang membenarkan penambahan statik atau dinamik gelagat pada objek tunggal tanpa menjejaskan gelagat objek lain. Kelas yang sama.

Dalam bahagian sebelumnya, kita telah melihat bahawa kita boleh melanjutkan kefungsian/kelakuan menggunakan subkelas, tetapi apabila ia datang untuk menambah berbilang fungsi/tingkah laku, ia menjadi bertele-tele dan kompleks. Di sinilah kita harus menggunakan corak penghias.

Antaramuka

interface eMailBody {
    public function loadBody();
}

Ini adalah antara muka mudah yang digunakan untuk memastikan kelas tertentu mesti melaksanakan kaedah yang diperlukan.

Kategori e-mel utama

class eMail implements eMailBody {
    public function loadBody() {
		echo "This is Main Email body.<br />";
	} 
}

Ini ialah kelas utama yang menjana badan lalai e-mel, saya biasanya menggunakannya untuk menghantar e-mel. Walau bagaimanapun, apa yang saya perlukan ialah mengubah suai kandungan badan berdasarkan keadaan tertentu tetapi tidak menukar kelas e-mel utama.

Master Penghias

abstract class emailBodyDecorator implements eMailBody {
    	
	protected $emailBody;
	
	public function __construct(eMailBody $emailBody) {
		$this->emailBody = $emailBody;
	}
	
	abstract public function loadBody();
	
} 

Ini ialah kelas penghias utama kami, ia memegang rujukan kepada kelas e-mel utama kami dan mengubah tingkah lakunya mengikut keperluan. Di sini kami mentakrifkan kaedah abstrak, loadBody, yang penghias kanak-kanak perlu laksanakan untuk mengubah tingkah laku.

Penghias Kanak-kanak

class christmasEmailBody extends emailBodyDecorator {
    	
	public function loadBody() {
		
		echo 'This is Extra Content for Christmas<br />';
		$this->emailBody->loadBody();
		
	}
	
}

class newYearEmailBody extends emailBodyDecorator {

	public function loadBody() {
		
		echo 'This is Extra Content for New Year.<br />';
		$this->emailBody->loadBody();
		
	}

}

Di sini kami telah mencipta dua subkelas penghias utama yang sebenarnya melakukan perubahan tingkah laku pada kelas e-mel utama kami.

Pasang semuanya

Kami telah mencipta semua elemen yang diperlukan. Apa yang perlu kami lakukan ialah menggunakan kod kami dan nikmati.

interface eMailBody {
    public function loadBody();
}

class eMail implements eMailBody {
	public function loadBody() {
		echo "This is Main Email body.<br />";
	} 
}

abstract class emailBodyDecorator implements eMailBody {
	
	protected $emailBody;
	
	public function __construct(eMailBody $emailBody) {
		$this->emailBody = $emailBody;
	}
	
	abstract public function loadBody();
	
} 

class christmasEmailBody extends emailBodyDecorator {
	
	public function loadBody() {
		
		echo 'This is Extra Content for Christmas<br />';
		$this->emailBody->loadBody();
		
	}
	
}

class newYearEmailBody extends emailBodyDecorator {

	public function loadBody() {
		
		echo 'This is Extra Content for New Year.<br />';
		$this->emailBody->loadBody();
		
	}

}

Kini kami akan menggunakan kelas penghias ini dalam pelbagai cara mengikut keperluan:

/*
 *  Normal Email
 */

$email = new eMail();
$email->loadBody();

// Output
This is Main Email body.


/*
 *  Email with Xmas Greetings
 */

$email = new eMail();
$email = new christmasEmailBody($email);
$email->loadBody();

// Output
This is Extra Content for Christmas
This is Main Email body.

/*
 *  Email with New Year Greetings
 */

$email = new eMail();
$email = new newYearEmailBody($email);
$email->loadBody();


// Output
This is Extra Content for New Year.
This is Main Email body.

/*
 *  Email with Xmas and New Year Greetings
 */

$email = new eMail();
$email = new christmasEmailBody($email);
$email = new newYearEmailBody($email);
$email->loadBody();

// Output
This is Extra Content for New Year.
This is Extra Content for Christmas
This is Main Email body.

Kami dapat melihat bahawa kini kami telah menukar badan e-mel tanpa mengubahsuai kelas e-mel utama.

Kesimpulan

Setiap aplikasi yang kami ada memerlukan beberapa jenis perubahan dan/atau penambahbaikan secara berkala. Jadi dalam kes ini, kami boleh melaksanakan corak reka bentuk penghias yang akhirnya akan meningkatkan kualiti kod dan menjadikan kod kami lebih berskala.

Saya cuba sedaya upaya untuk menerangkan corak penghias kepada anda, tetapi jika anda mempunyai sebarang komen atau soalan lain, sila tambahkannya pada suapan di bawah.

Atas ialah kandungan terperinci Corak Penghias: Melancarkan Kuasa Corak Reka Bentuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn