Decorator

GOF Intent:
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

Decorator Pattern براي افزودن (Decorate کردن) به قابليت هاي يک Object در زمان اجرا (Run Time)، مستقل از ساير instance هاي آن Object، استفاده مي شود.

Decorator مي تواند جايگزين Subclassing باشد. با اين تفاوت که Subclassing در زمان Design اعمال مي شود، اما Decorator در زمان اجرا.

Wrapper نام ديگر اين Pattern است.

Decorator Design Pattern

بهترين راه براي آشنايي با اين Pattern پيگيري يک مثال است
تعريف کلاس زير را براي Coffee ساده در نظر بگيريد:

Public interface Coffee{
   public int getCost();
   public String getIngredients();
}


public class SimpleCoffee implements Coffee{
   public int getCost(){
      return 100;
   }
   public String getIngredients(){
      return “Coffee”;
   }
}

حال مي خواهيم در زمان اجرا کلاس SimpleCofee را با مواد ديگر مثل شير يا شکر به دلخواه Decorate نماييم:

public abstract class CoffeeDecorator implements Coffee{

   protected Coffee decoratedCoffee;

   public CoffeeDecorator(Coffee decoratedCoffee){
      this.decoratedCoffee = decoratedCoffee;
   }

   public int getCost(){
      return decoratedCoffee.getCost();
   }

   public String getIngredients(){
      return decoratedCoffee.getIngredients();
   }
}


public class Milk extends CoffeeDecorator{

   public Milk(Coffee decoratedCoffee){
      super(decoratedCoffee);
   }

   public int getCost(){
   return super.getCost() + 50;
   }

   public String getIngredients(){
      return super.getIngredients() + “, Milk”;
   }
}


public class Sugar extends CoffeeDecorator{

   public Sugar(Coffee decoratedCoffee){
      super(decoratedCoffee);
   }

   public int getCost(){
      return super.getCost() + 20;
   }

   public String getIngredients(){
      return super.getIngredients() + “, Sugar”;
   }
}


public static void main(String[] args){

   // Createing Simple Cofee
   Coffee c = new SimpleCoffee();

   c = new Milk(c);    //Adding Milk
   c = new Sugar(c);    //Adding Sugar

   System.out.println(“Price :”+c.getCost());
   System.out.println(“Ingredients :”+c.getIngredients());
}

دو نمونه کاربرد در دنياي واقعي:

  • محاسبه قيمت بيمه بدنه اتومبيل. که يک قيمت پايه دارد و بقيه Option ها از جمله سرقت، آتش سوزي و غيره بعنوان Decorator به بيمه پايه افزوده مي شوند.
  • در زبان هاي برنامه نويسي و فريم ورک ها از اين Pattern براي I/O Stream ها زياد استفاده مي شود. مثلا با Wrap نمودن FileStream با GzipStrem براي افزودن قابليت فشرده سازي به آن.



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Decorator in Wikipedia

با برچسب: ,
پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


× هشت = 16

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com