JavaRush /جاوا بلاگ /Random-UR /جاوا ڈیکوریٹر پیٹرن

جاوا ڈیکوریٹر پیٹرن

گروپ میں شائع ہوا۔
کتاب میں "ہیڈ فرسٹ۔ ایرک فری مین اور الزبتھ رابسن کے ذریعہ ڈیزائن پیٹرنز اس کی وضاحت اس طرح کرتا ہے: ڈیکوریٹر پیٹرن متحرک طور پر کسی چیز کو نئی صلاحیتیں فراہم کرتا ہے اور فعالیت کو بڑھانے کے لیے ذیلی طبقے کا متبادل ہے۔ آئیے ایک مثال کا استعمال کرتے ہوئے اس تعریف کو مزید تفصیل سے دیکھنے کی کوشش کرتے ہیں۔ فرض کریں کہ آپ نے ایک اور جدید مذہب بنایا ہے اور لوگوں کو متعلقہ خدمات فراہم کرنے کا منصوبہ بنایا ہے۔ کیونکہ جدید رجحانات سبزی پرستی، ماحولیات، انسانی ترقی کی پیروی کرتے ہیں، اور کسی وجہ سے لوگ "روایتی" مذاہب (یا آخر میں الحاد) سے مطمئن نہیں ہیں، پھر آپ، مرکزی دھارے کی پیروی کرتے ہوئے، ایک اور نیو ایج مذہب (موجودہ سے ایک قسم کی ترکیب) تشکیل دیتے ہیں۔ مذاہب، ہر ایک سے لے کر کیا پسند ہے)۔ شروع میں آپ درج ذیل خدمات فراہم کرتے ہیں: 1. قسمت بتانا 2. زائچہ یعنی زائچہ۔ سب کچھ اس طرح لگتا ہے: کورس کی قیمت کے ساتھ ایک سروس انٹرفیس ہے :) اور ایک تفصیل
public interface Service {
    public double getPrice();
    public String getLabel();
}
اور خدمات
public class Divination implements Service {
    private String label;
    private double price;

    public Divination(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
public class Horoscope implements Service {
    private String label;
    private double price;

    public Horoscope(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
ٹھیک ہے، اس کے مطابق، 2 آرڈرز سامنے آئے (ٹیرو کارڈ کے ساتھ خوش قسمتی اور کلائنٹ کی طرف سے ذاتی زائچہ):
public static void main(String[] args) {
    double cost;
    // Гадание на Таро
    Service taro = new Divination("Таро", 1000);
    // И персональный гороскоп
    Service personalHoroscope = new Horoscope("Персональный гороскоп", 9000);
    cost = taro.getPrice() + personalHoroscope.getPrice();

    System.out.println(cost);
}
اور پروگرام کا نتیجہ:
10000.0
سب کچھ ٹھیک ہو جائے گا، لیکن آپ کی طرح سینکڑوں، ہزاروں نہیں تو پہلے ہی موجود ہیں، اور ہمیں لوگوں کی روحانیت کو فروغ دینا جاری رکھنا ہے، ورنہ وہ مزید دلچسپی نہیں رکھتے۔ لہذا، موجودہ خدمات کے اضافی اختیارات کو ایک اختیار کے طور پر پیش کیا گیا تھا. مثال کے طور پر، قسمت بتانے کی سروس (ٹیرو یا کافی گراؤنڈز) کا انتخاب کرتے وقت، ایک اضافی آپشن کے طور پر آپ چکروں یا چمک کی خصوصیات (ہر ایک کے لیے ان کی اپنی قیمت کے ساتھ) آرڈر کر سکتے ہیں۔ اس کو کیسے لاگو کیا جا سکتا ہے تاکہ موجودہ سروس کلاسز میں تبدیلیاں نہ کی جائیں، جہاں ہر چیز کو پہلے سے ہی ترتیب دیا گیا ہے اور درست طریقے سے حساب لگایا گیا ہے۔ آپ موجودہ ڈیوی ایشن کے لیے Divination + Chakras یا Divination + Aura کی اضافی کلاسیں تشکیل دے سکتے ہیں:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
یا صرف ذیلی کلاسنگ کا استعمال کریں، یعنی والدین کی کلاس کو چائلڈ کلاس تک بڑھانا
public class DivinationWithAura extends Divination {
    public DivinationWithAura(String label, double price) {
        super(label, price);
    }
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras extends Divination {
    public DivinationWithChakras(String label, double price) {
        super(label, price);
    }
    // Здесь своя стоимость и другие методы
}
لیکن نقصانات فوری طور پر نظر آتے ہیں، پوری دنیا کی روحانیت کو فروغ دیتے ہوئے، ہمارے پاس نئے اضافی اختیارات ہوسکتے ہیں، جس کا مطلب ہے نئی کلاسز، اور اگر ہمیں اب بھی موجودہ کلاسوں کو یکجا کرنے کی ضرورت ہے، تو کلاسیں تیزی سے بڑھیں گی، کم از کم ہمارے پاس اب نہیں ہے۔ دو اختیارات کے ساتھ فارچیون ٹیلنگ کلاس کافی ہے، اور الگ الگ نہیں:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
یہ وہ جگہ ہے جہاں آپ جاوا میں بہت "محفوظ" ڈیکوریٹر پیٹرن استعمال کرسکتے ہیں۔ ایسا کرنے کے لیے، ہم اضافی اختیارات کے لیے ایک کلاس بنائیں گے، جو سروس کو بھی نافذ کرے گی، بلکہ سروس پر مشتمل ہوگی۔ اور اسی کے مطابق، جب ہمیں قسمت بتانے کے لیے آرڈر دینے کی ضرورت ہوتی ہے اور یہاں تک کہ 2 آپشنز ایک ساتھ ہوتے ہیں، تو یہ اس طرح نظر آئے گا: انٹرفیس ویسا ہی ہے جیسا کہ یہ شروع سے تھا۔
public interface Service {
    public double getPrice();
    public String getLabel();
}
خدمات کی 2 کلاسیں، پہلے کی طرح:
public class Divination implements Service {
    private String label;
    private double price;

    public Divination(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
public class Horoscope implements Service {
    private String label;
    private double price;

    public Horoscope(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
اضافی اختیارات کے لیے ڈیکوریٹر
public class OptionDecorator implements Service {
    private Service service;
    private String label;
    private double price;

    public OptionDecorator(Service service, String label, double price) {
        this.service = service;
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price + service.getPrice();
    }

    public String getLabel() {
        return this.label + service.getLabel();
    }
}
اور خود اختیارات (اب تک 2):
public class Aura extends OptionDecorator {
    public Aura(Service service) {
        super(service, "Характеристика ауры", 1500);
    }
}
public class Chakra extends OptionDecorator {
    public Chakra(Service service) {
        super(service, "Характеристика чакр", 500);
    }
}
ٹھیک ہے، آرڈر خود
public static void main(String[] args) {
    // Гадание на Таро
    Service taro = new Divination("Таро", 1000);
    Service chakra = new Chakra(taro);
    Service aura = new Aura(chakra);

    // И общая стоимость
    System.out.println(aura.getPrice());
}
3000.0
جو مین سروس کے مجموعے اور 2 اضافی اختیارات کا نتیجہ دیتا ہے۔ اس کا مطلب یہ ہے کہ ہر اضافی کی ضرورت نہیں ہے۔ ایک نئی کلاس بنانے کے لیے آپشن (یا دونوں کا مجموعہ)۔ اس کے علاوہ، ان اختیارات کا اطلاق نہ صرف خوش قسمتی بتانے کی سروس پر، بلکہ ہوروسکوپ سروس پر بھی کیا جا سکتا ہے۔ لہذا، جب مستقبل قریب میں ہمیں درج ذیل اضافی اختیارات کو لاگو کرنے کی ضرورت ہو: - سوشل نیٹ ورکس پر اوتار پارٹنرز کی مطابقت - ریموٹ چینلنگ کے ذریعے کیش فلو کو بہتر بنانا، ہمیں صرف 2 اضافی کلاسز لکھنے کی ضرورت ہوگی:
public class Channeling extends OptionDecorator {
    public Channeling(Service service) {
        super(service, "Полет в Поле Чудес", 99999);
    }
}
public class Avatar extends OptionDecorator {
    public Avatar(Service service) {
        super(service, "Ваша любовь в соц сетях", 5555);
    }
}
اور آپ انہیں کسی بھی سروس میں شامل کر سکتے ہیں:
public static void main(String[] args) {
    // Гадание на Таро
    Service taro = new Divination("Таро", 1000);
    Service chakra = new Chakra(taro);
    Service aura = new Aura(chakra);

    // И общая стоимость
    System.out.println(aura.getPrice());

    // Гороскоп
    Service horoscope = new Horoscope("Персональный гороскоп", 1000);
    Service channenling = new Channeling(horoscope);
    Service avatar = new Avatar(channenling);

    // И общая стоимость
    System.out.println(avatar.getPrice());
}
اور پروگرام کا نتیجہ (جس کی ہمیں ضرورت ہے):
3000.0
106554.0
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION