Corak Penghias di Jawa

1. Gambaran keseluruhan

Corak Penghias boleh digunakan untuk memikul tanggungjawab tambahan pada objek sama ada secara statik atau dinamik. Penghias menyediakan antara muka yang lebih baik untuk objek asal.

Dalam pelaksanaan corak ini, kami lebih memilih komposisi daripada pewarisan - supaya kami dapat mengurangkan overhead subkelas berulang-ulang untuk setiap elemen hiasan. Rekursi yang terlibat dengan reka bentuk ini dapat digunakan untuk menghiasi objek kita seberapa banyak yang kita perlukan.

2. Contoh Corak Penghias

Katakan kita mempunyai objek pokok Krismas dan kita mahu menghiasnya. Dekorasi tidak mengubah objek itu sendiri; hanya di samping pokok Krismas, kami menambah beberapa barang hiasan seperti garland, tinsel, top-tree, bubble bubble, dll

Untuk senario ini, kami akan mengikuti konvensyen reka bentuk dan penamaan Gang of Four yang asal. Pertama, kami akan membuat antara muka ChristmasTree dan pelaksanaannya:

public interface ChristmasTree { String decorate(); }

Pelaksanaan antara muka ini akan kelihatan seperti:

public class ChristmasTreeImpl implements ChristmasTree { @Override public String decorate() { return "Christmas tree"; } }

Kami sekarang akan membuat kelas TreeDecorator abstrak untuk pokok ini. Penghias ini akan melaksanakan antara muka ChristmasTree serta memegang objek yang sama. Kaedah yang dilaksanakan dari antara muka yang sama hanya memanggil kaedah menghias () dari antara muka kami:

public abstract class TreeDecorator implements ChristmasTree { private ChristmasTree tree; // standard constructors @Override public String decorate() { return tree.decorate(); } }

Kami sekarang akan membuat beberapa elemen hiasan. Penghias ini akan melanjutkan kelas TreeDecorator abstrak kami dan akan mengubah kaedah menghiasnya () mengikut keperluan kami:

public class BubbleLights extends TreeDecorator { public BubbleLights(ChristmasTree tree) { super(tree); } public String decorate() { return super.decorate() + decorateWithBubbleLights(); } private String decorateWithBubbleLights() { return " with Bubble Lights"; } }

Untuk kes ini, perkara berikut adalah benar:

@Test public void whenDecoratorsInjectedAtRuntime_thenConfigSuccess() { ChristmasTree tree1 = new Garland(new ChristmasTreeImpl()); assertEquals(tree1.decorate(), "Christmas tree with Garland"); ChristmasTree tree2 = new BubbleLights( new Garland(new Garland(new ChristmasTreeImpl()))); assertEquals(tree2.decorate(), "Christmas tree with Garland with Garland with Bubble Lights"); }

Perhatikan bahawa pada objek tree1 pertama , kita hanya menghiasnya dengan satu Garland sahaja , sedangkan objek tree2 yang lain kita menghiasnya dengan satu BubbleLights dan dua Garlands . Corak ini memberi kita fleksibiliti ini untuk menambah sebilangan penghias yang kita mahukan pada waktu runtime.

4. Kesimpulan

Dalam artikel ini, kami melihat corak reka bentuk penghias. Ini adalah pilihan yang baik dalam kes berikut:

  • Apabila kita ingin menambah, meningkatkan atau bahkan menghilangkan tingkah laku atau keadaan objek
  • Apabila kita hanya mahu mengubah fungsi satu objek kelas dan membiarkan yang lain tidak berubah

Kod sumber penuh untuk contoh ini boleh didapati di GitHub.