Corak penghias
Corak Penghias membenarkan menambah fungsi baharu pada objek sedia ada tanpa mengubah strukturnya. Corak reka bentuk jenis ini ialah corak struktur, yang bertindak sebagai pembalut di sekeliling kelas sedia ada.
Corak ini mencipta kelas hiasan untuk membalut kelas asal dan menyediakan kefungsian tambahan sambil mengekalkan integriti tandatangan kaedah kelas.
Kami menunjukkan penggunaan corak penghias melalui contoh berikut. Antaranya, kita akan menghias bentuk dengan warna yang berbeza tanpa mengubah kelas bentuk.
Pengenalan
Niat: Tambahkan beberapa tanggungjawab tambahan pada objek secara dinamik. Dari segi menambah fungsi, corak penghias adalah lebih fleksibel daripada menjana subkelas.
Penyelesaian utama: Secara amnya, kami sering menggunakan warisan untuk melanjutkan kelas Memandangkan pewarisan memperkenalkan ciri statik kepada kelas, dan apabila fungsi sambungan meningkat, subkelas akan menjadi sangat berkembang.
Bila hendak digunakan: Melanjutkan kelas tanpa menambah banyak subkelas.
Cara menyelesaikan: Bahagikan tanggungjawab fungsi tertentu dan warisi corak penghias.
Kod utama: 1. Kelas Komponen memainkan peranan abstrak dan tidak seharusnya dilaksanakan secara konkrit. 2. Ubah suai kelas untuk merujuk dan mewarisi kelas Komponen, dan secara khusus melanjutkan kelas untuk mengatasi kaedah kelas induk.
Contoh aplikasi: 1. Sun Wukong mempunyai 72 transformasi Apabila dia menjadi "kuil", dia pada dasarnya adalah monyet, tetapi dia mempunyai fungsi kuil. 2. Lukisan boleh digantung di dinding tanpa mengira sama ada ia mempunyai bingkai atau tidak, tetapi biasanya ia mempunyai bingkai, dan bingkai itu sebenarnya digantung di dinding. Sebelum digantung di dinding, lukisan itu boleh dikaca dan dibingkai kemudian lukisan, kaca dan bingkai membentuk satu objek.
Kelebihan: Kelas menghias dan kelas berhias boleh berkembang secara berasingan dan tidak akan digabungkan antara satu sama lain Mod hiasan ialah mod alternatif kepada pewarisan fungsi kelas pelaksanaan.
Kelemahan: Hiasan berbilang lapisan lebih rumit.
Senario penggunaan: 1. 2. Tambah fungsi secara dinamik dan batalkannya secara dinamik.
Nota: boleh menggantikan harta pusaka.
Pelaksanaan
Kami akan mencipta antara muka Shape dan kelas entiti yang melaksanakan antara muka Shape. Kemudian kami mencipta kelas hiasan abstrak ShapeDecorator yang melaksanakan antara muka Shape dan menggunakan objek Shape sebagai pembolehubah contohnya.
RedShapeDecorator ialah kelas entiti yang melaksanakan ShapeDecorator.
DecoratorPatternDemo, kelas demo kami menggunakan RedShapeDecorator untuk menghiasi objek Shape.
Langkah 1
Buat antara muka.
Shape.java
public interface Shape { void draw(); }
Langkah 2
Buat kelas entiti yang melaksanakan antara muka.
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Shape: Rectangle"); } }
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Shape: Circle"); } }
Langkah 3
Buat kelas hiasan abstrak yang melaksanakan antara muka Shape.
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape){ this.decoratedShape = decoratedShape; } public void draw(){ decoratedShape.draw(); } }
Langkah 4
Buat kelas hiasan entiti yang memanjangkan kelas ShapeDecorator.
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape); } @Override public void draw() { decoratedShape.draw(); setRedBorder(decoratedShape); } private void setRedBorder(Shape decoratedShape){ System.out.println("Border Color: Red"); } }
Langkah 5
Gunakan RedShapeDecorator untuk menghiasi objek Shape.🎜>
DecoratorPatternDemo.java
public class DecoratorPatternDemo { public static void main(String[] args) { Shape circle = new Circle(); Shape redCircle = new RedShapeDecorator(new Circle()); Shape redRectangle = new RedShapeDecorator(new Rectangle()); System.out.println("Circle with normal border"); circle.draw(); System.out.println("\nCircle of red border"); redCircle.draw(); System.out.println("\nRectangle of red border"); redRectangle.draw(); } }Langkah 6Sahkan output.
Circle with normal border Shape: Circle Circle of red border Shape: Circle Border Color: Red Rectangle of red border Shape: Rectangle Border Color: Red