بخش های اصلی

آموزش الگوهای طراحی

Design Pattern - الگوی Decorator

الگوی Decorator به کاربر این امکان را میده تا بدون تغییر ساختارِ شیءای که از قبل وجود داشته، ویژگیِ جدیدی به آن اضافه کنه. از آن جایی که این الگوی طراحی بعنوانِ پوشش دهنده ای برای کلاس های موجود عمل می کنه، زیرگروه الگوی ساختاری (structural) محسوب میشه.

این الگو یک کلاسِ decorator ایجاد می کنه که کلاس های اصلی را پوشش می ده و عملکرد ها و ویژگی های اضافیِ آن، متد های کلاس را دست نخورده نگه می دارن.

طرز کار الگویِ decorator را از طریق مثال زیر به شما نشان می دیم که در آن بدون این که کلاسِ shape را تغییر بدیم، آن شکل را با کمی رنگ، تزیین می کنیم (decorate)،

پیاده سازی

در این بخش یک رابط به نام Shape و کلاس های concreteای که این رابط را پیاده سازی می کنن، ایجاد می کنیم. سپس یک کلاسِ decorator انتزاعی (abstract) به نام ShapeDecorator که رابطِ Shape را پیاده سازی می کنه و شیءِ Shape را بعنوان یک نمونه متغیر در خود داره، ایجاد می کنیم.

RedShapeDecorator یک کلاسِ concrete است که ShapeDecrator را پیاده سازی می کنه.

DecoratorPatternDemo، نسخه ی آزمایشیِ کلاس مان از RedShapeDecorator برای تزئیینِ اشیاءِ Shape استفاده می کنه.

decorator pattern uml diagram

مرحله ی 1

ایجاد یک رابط.

Shape.java

public interface Shape {
   void draw();
}

مرحله ی 2

ایجاد کلاس های concreteای که رابطی یکسان پیاده سازی می کنن.

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");
   }
}

مرحله ی 3

ایجاد کلاسِ decorator انتزاعی (abstract)ای که رابطِ Shape را پیاده سازی می کنه.

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }	
}

مرحله ی 4

ایجاد یک کلاسِ concrete با نامِ decorator که کلاس 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");
   }
}

مرحله ی 5

استفاده از RedShapeDecorator برای تزیینِ اشیاءِ 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();
   }
}

مرحله ی 6

بررسی خروجی

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش الگوهای طراحی

Learn Design Patterns

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد