JavaRush /Blog Jawa /Random-JV /Pola Dekorasi Jawa

Pola Dekorasi Jawa

Diterbitake ing grup
Ing buku "Head First. Pola Desain "dening Eric Freeman lan Elizabeth Robson nemtokake minangka nderek: Pola dekorator kanthi dinamis nyedhiyakake kapabilitas anyar kanggo obyek lan minangka alternatif kanggo subclassing kanggo nambah fungsi. Coba deleng definisi iki kanthi luwih rinci nggunakake conto. Upamane sampeyan wis nggawe agama modern liyane lan rencana nyedhiyakake layanan sing cocog karo wong. Amarga tren modern nguber vegetarianism, ekologi, pembangunan manungsa, lan sakperangan alesan wong ora wareg karo "tradisional" agama (utawa ateisme ing pungkasan), banjur sampeyan, ing ngisor iki mainstream, nggawe agama New Age liyane (jinis sintesis saka ana. agama, njupuk saka saben liyane). Ing wiwitan sampeyan nyedhiyakake layanan ing ngisor iki: 1. Rejeki 2. Horoskop Ie. kabeh katon kaya iki: Ana antarmuka layanan karo rega mesthi :) lan gambaran
public interface Service {
    public double getPrice();
    public String getLabel();
}
lan layanan
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;
    }
}
Inggih, miturut, 2 pesenan muncul (ramalan karo kertu Tarot lan horoskop pribadi saka klien):
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);
}
lan asil saka program:
10000.0
Kabeh bakal apik, nanging wis ana atusan, yen ora ewu, kaya sampeyan, lan kita kudu terus ngembangake spiritualitas wong, yen ora, dheweke ora kasengsem maneh. Mulane, opsi tambahan kanggo layanan saiki ditawakake minangka pilihan. Contone, nalika milih layanan rejeki (Tarot utawa warung), minangka pilihan tambahan sampeyan bisa order karakteristik chakras utawa aura (kanthi biaya dhewe kanggo saben). Kepiye carane bisa ditindakake supaya ora nggawe owah-owahan ing kelas layanan sing wis ana, ing ngendi kabeh wis dikonfigurasi lan diwilang kanthi bener. Sampeyan bisa nggawe kelas tambahan Divination + Chakra utawa Divination + Aura menyang Divination saiki:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
utawa mung nggunakake subclassing, i.e. ngluwihi kelas induk menyang kelas anak
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);
    }
    // Здесь своя стоимость и другие методы
}
Nanging kerugian kasebut langsung katon, ngembangake spiritualitas ing saindenging jagad, bisa uga duwe pilihan tambahan anyar, sing tegese kelas anyar, lan yen isih kudu nggabungake sing saiki, mula kelas kasebut bakal tuwuh kanthi cepet, paling ora ana maneh. cukup kelas Fortune ngandhani karo rong opsi bebarengan, lan ora kapisah dhewe:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
Iki ngendi sampeyan bisa nggunakake banget "nyimpen" pola Decorator ing Jawa. Kanggo nindakake iki, kita bakal nggawe kelas kanggo opsi tambahan, kang uga bakal ngleksanakake Service, nanging uga ngemot Service. Lan kanthi mangkono, nalika kita kudu nggawe pesenan kanggo ramalan lan malah kanthi 2 opsi bebarengan, bakal katon kaya iki: Antarmuka kaya wiwit wiwitan.
public interface Service {
    public double getPrice();
    public String getLabel();
}
2 kelas layanan, padha karo sadurunge:
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;
    }
}
Dekorator kanggo opsi tambahan
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();
    }
}
Lan pilihan dhewe (2 nganti saiki):
public class Aura extends OptionDecorator {
    public Aura(Service service) {
        super(service, "Характеристика ауры", 1500);
    }
}
public class Chakra extends OptionDecorator {
    public Chakra(Service service) {
        super(service, "Характеристика чакр", 500);
    }
}
Inggih, pesenan dhewe
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
kang menehi asil saka jumlah saka layanan utama lan 2 opsi tambahan. Iki tegese ora perlu saben tambahan pilihan (utawa kombinasi saka loro) kanggo nggawe kelas anyar. Kajaba iku, opsi kasebut bisa ditrapake ora mung kanggo layanan Fortune, nanging uga kanggo layanan Horoskop. Dadi, nalika ing mangsa ngarep kita kudu ngetrapake opsi tambahan ing ngisor iki: - kompatibilitas mitra avatar ing jaringan sosial - nambah aliran awis liwat saluran remot, kita kudu nulis mung 2 kelas tambahan:
public class Channeling extends OptionDecorator {
    public Channeling(Service service) {
        super(service, "Полет в Поле Чудес", 99999);
    }
}
public class Avatar extends OptionDecorator {
    public Avatar(Service service) {
        super(service, "Ваша любовь в соц сетях", 5555);
    }
}
lan sampeyan bisa nambah menyang layanan apa wae:
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());
}
lan asil program (sing kita butuhake):
3000.0
106554.0
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION