Pola Decorator
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 96 dari 110.
Pola Decorator memungkinkan kamu menambahkan perilaku baru ke object secara dinamis dengan membungkusnya dalam object khusus yang disebut decorator. Tidak seperti pewarisan, yang menambahkan perilaku pada waktu kompilasi, decorator menambahkan tanggung jawab tambahan saat program berjalan tanpa mengubah class asli.
Gagasan utamanya adalah object asli dan decorator menerapkan antarmuka yang sama.
Decorator membungkus object asli, mendelegasikan tugas kepadanya, dan menambahkan perilakunya sendiri sebelum atau sesudahnya:
abstract class Coffee {
String getDescription();
double getCost();
}
class SimpleCoffee implements Coffee {
@override
String getDescription() => 'Simple Coffee';
@override
double getCost() => 2.0;
}
class MilkDecorator implements Coffee {
final Coffee _coffee;
MilkDecorator(this._coffee);
@override
String getDescription() => '${_coffee.getDescription()}, Milk';
@override
double getCost() => _coffee.getCost() + 0.5;
}
class SugarDecorator implements Coffee {
final Coffee _coffee;
SugarDecorator(this._coffee);
@override
String getDescription() => '${_coffee.getDescription()}, Sugar';
@override
double getCost() => _coffee.getCost() + 0.2;
}
void main() {
Coffee coffee = SimpleCoffee();
coffee = MilkDecorator(coffee);
coffee = SugarDecorator(coffee);
print(coffee.getDescription()); // Simple Coffee, Milk, Sugar
print(coffee.getCost()); // 2.7
}Setiap decorator membungkus object sebelumnya dan meningkatkannya. Kamu dapat menumpuk beberapa decorator dalam kombinasi apa pun, sehingga menciptakan perilaku yang fleksibel tanpa membuat subclass untuk setiap kombinasi yang mungkin. Pola ini ideal saat kamu perlu menambahkan fitur ke object tanpa memengaruhi object lain dari class yang sama.
Tantangan
MudahMari buat sistem pemesanan pizza menggunakan pola Decorator! Kamu akan membuat pizza dasar yang bisa ditambahkan berbagai topping. Setiap topping membungkus item sebelumnya dan menambahkan sesuatu pada deskripsi serta harganya.
Kamu akan mengatur kodemu ke dalam dua file:
pizza.dart: File ini berisi antarmuka pizza dan semua class decorator. Mulailah dengan abstract classPizzayang mendefinisikan dua method:String getDescription()dandouble getPrice(). Lalu, buat classPlainPizzayang mengimplementasikanPizza. Class ini mengembalikanPlain Pizzasebagai deskripsinya dan harganya8.0. Sekarang, buat tiga class decorator yang masing-masing membungkusPizzadan menambahkan sesuatu padanya:CheeseDecorator, menambahkan, Cheesepada deskripsi dan1.5pada hargaPepperoniDecorator, menambahkan, Pepperonipada deskripsi dan2.0pada hargaMushroomDecorator, menambahkan, Mushroomspada deskripsi dan1.25pada harga
Pizza, menerimaPizzadalam konstruktornya, dan mendelegasikan pemanggilan ke pizza yang dibungkus sebelum menambahkan kontribusinya sendiri.main.dart: Impor file pizza-mu dan tunjukkan cara decorator ditumpuk untuk membuat pesanan khusus. Mulailah denganPlainPizza, lalu bungkus denganCheeseDecorator, kemudian bungkus denganPepperoniDecorator, dan terakhir bungkus semuanya denganMushroomDecorator. Cetak deskripsi akhir pizza, lalu cetakTotal: $diikuti harganya.
Perhatikan bagaimana setiap decorator dikembangkan dari decorator sebelumnya. Kamu sedang membuat pizza dengan topping lengkap menggunakan decorator sederhana yang masing-masing memiliki satu tanggung jawab!
Output yang diharapkan:
Plain Pizza, Cheese, Pepperoni, Mushrooms
Total: $12.75Coba sendiri
import 'pizza.dart';
void main() {
// TODO: Buat PlainPizza
// TODO: Bungkus pizza dengan CheeseDecorator
// TODO: Bungkus hasilnya dengan PepperoniDecorator
// TODO: Bungkus semuanya dengan MushroomDecorator
// TODO: Cetak deskripsi pizza akhir
// TODO: Cetak "Total: $" diikuti harganya
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil Data15Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola RepositoryLatihan sendiri: Compiler Dart online