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.

decorator_pattern_uml_diagram.jpg

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 6

Sahkan 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