Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Pizza yang mendefinisikan dua method: String getDescription() dan double getPrice(). Lalu, buat class PlainPizza yang mengimplementasikan Pizza. Class ini mengembalikan Plain Pizza sebagai deskripsinya dan harganya 8.0. Sekarang, buat tiga class decorator yang masing-masing membungkus Pizza dan menambahkan sesuatu padanya:
    • CheeseDecorator, menambahkan , Cheese pada deskripsi dan 1.5 pada harga
    • PepperoniDecorator, menambahkan , Pepperoni pada deskripsi dan 2.0 pada harga
    • MushroomDecorator, menambahkan , Mushrooms pada deskripsi dan 1.25 pada harga
    Setiap decorator harus mengimplementasikan Pizza, menerima Pizza dalam 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 dengan PlainPizza, lalu bungkus dengan CheeseDecorator, kemudian bungkus dengan PepperoniDecorator, dan terakhir bungkus semuanya dengan MushroomDecorator. Cetak deskripsi akhir pizza, lalu cetak Total: $ 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.75

Coba 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
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online