memperkenalkan
Dekorator menawarkan alternatif yang lebih fleksibel daripada warisan. Dekorator menggunakan objek yang digunakan untuk membungkus antarmuka yang sama, yang tidak hanya memungkinkan Anda untuk menambahkan perilaku ke metode, tetapi juga mengatur metode ke panggilan objek asli (seperti konstruktor dekorator).
Dekorator digunakan untuk menambahkan fungsi baru melalui bentuk metode yang kelebihan beban. Mode ini dapat menambah perilaku sendiri sebelum atau setelah dekorator untuk mencapai tujuan tertentu.
teks
Jadi apa manfaat dari mode dekorator? Seperti yang disebutkan sebelumnya, dekorator adalah alternatif untuk mencapai warisan. Saat skrip sedang berjalan, menambahkan perilaku ke subkelas mempengaruhi semua contoh kelas asli, tetapi dekorator tidak. Sebaliknya dapat menambahkan perilaku baru ke objek yang berbeda. Kode berikut terlihat seperti:
Salinan kode adalah sebagai berikut:
// kelas (fungsi) yang membutuhkan dekorasi (fungsi)
function macBook () {
this.cost = function () {
mengembalikan 1000;
};
}
memori fungsi (macbook) {
this.cost = function () {
return macbook.cost () + 75;
};
}
Function BlurayDrive (MacBook) {
this.cost = function () {
return macbook.cost () + 300;
};
}
Fungsi Asuransi (MacBook) {
this.cost = function () {
return macbook.cost () + 250;
};
}
// Penggunaan
var mymacbook = asuransi baru (new bluraydrive (memori baru (macbook baru ())));
console.log (mymacbook.cost ());
Di bawah ini adalah contoh lain. Ketika kami menyebut performaTask pada objek dekorator, ia tidak hanya memiliki beberapa perilaku dekorator, tetapi juga menyebut fungsi performaTask dari objek yang lebih rendah.
Salinan kode adalah sebagai berikut:
fungsi concreteClass () {
this.performTask = function () {
this.pretask ();
console.log ('melakukan sesuatu');
this.postTask ();
};
}
fungsi abstractDecorator (didekorasi) {
this.performTask = function () {
decorated.performTask ();
};
}
fungsi concretedecoratorclass (didekorasi) {
this.base = AbstractDecorator;
this.base (didekorasi);
Decorated.pecterask = function () {
console.log ('pra-panggilan ..');
};
Decorated.postTask = function () {
console.log ('post-calling ..');
};
}
var concrete = concreteClass baru ();
var decorator1 = concretedecoratorclass baru (beton);
var decorator2 = concretedecoratorClass baru (dekorator1);
dekorator2.performTask ();
Mari kita ambil contoh menyeluruh:
Salinan kode adalah sebagai berikut:
var tree = {};
tree.decorate = function () {
console.log ('Pastikan pohon itu menang/' jatuh ');
};
tree.getDecorator = function (deco) {
pohon [deco] .prototype = ini;
mengembalikan pohon baru [deco];
};
tree.redballs = function () {
this.decorate = function () {
this.redballs.prototype.decorate (); // Langkah 7: Pertama jalankan metode dekorasi prototipe (This is Angel)
Console.log ('Kenakan beberapa bola merah'); // langkah 8 output merah
// Gunakan 2 langkah ini sebagai metode dekorasi redballs
}
};
tree.blueballs = function () {
this.decorate = function () {
this.blueballs.prototype.decorate (); // Langkah 1: Pertama jalankan metode dekorasi prototipe, yaitu, Tree.Decorate ()
Console.log ('Tambahkan Bola Biru'); // langkah 2 keluaran biru
// Gunakan 2 langkah ini sebagai metode blueballs menghias
}
};
tree.angel = function () {
this.decorate = function () {
this.angel.prototype.decorate (); // Langkah 4: Pertama jalankan prototipe (ini blueballs) metode dekorasi
Console.log ('An Angel di atas'); // langkah 5 output malaikat
// Gunakan 2 langkah ini sebagai metode dekorasi Angel
}
};
Tree = Tree.getDecorator ('Blueballs'); // Langkah 3: Tetapkan objek blueballs ke pohon, dan getDecorator dalam prototipe induk masih tersedia
Tree = Tree.getDecorator ('Angel'); // Langkah 6: Tetapkan objek malaikat ke pohon. Saat ini, getDecorator dalam prototipe induk dari prototipe induk masih tersedia
Tree = Tree.getDecorator ('Redballs'); // Langkah 9: Tetapkan objek Redballs ke pohon
tree.decorate (); // Langkah 10: Jalankan metode dekorasi objek Redballs
Meringkaskan
Pola dekorator adalah cara untuk secara dinamis menambahkan lebih banyak fungsi ke fungsi yang ada. Setiap fungsi yang akan didekorasi ditempatkan dalam fungsi terpisah, dan kemudian gunakan fungsi ini untuk membungkus objek fungsi yang ada untuk didekorasi. Oleh karena itu, ketika perilaku khusus perlu dilakukan, kode panggilan dapat secara selektif dan berurutan menggunakan fungsi dekorasi untuk membungkus objek sesuai kebutuhan. Keuntungannya adalah membedakan tanggung jawab inti kelas (fungsi) dari fungsi dekoratif.