JavaRush /Blog Java /Random-VI /Mẫu trang trí Java

Mẫu trang trí Java

Xuất bản trong nhóm
Trong cuốn sách “Đầu tiên. Design Patterns” của Eric Freeman và Elizabeth Robson định nghĩa nó như sau: Mẫu Decorator tự động cung cấp các khả năng mới cho một đối tượng và là một giải pháp thay thế cho việc phân lớp con để mở rộng chức năng. Chúng ta hãy thử xem xét định nghĩa này chi tiết hơn bằng cách sử dụng một ví dụ. Giả sử bạn đã tạo ra một tôn giáo hiện đại hơn và dự định cung cấp cho mọi người những dịch vụ tương ứng. Bởi vì xu hướng hiện đại theo đuổi việc ăn chay, sinh thái, phát triển con người và vì lý do nào đó mà mọi người không hài lòng với các tôn giáo “truyền thống” (hay cuối cùng là chủ nghĩa vô thần), thì bạn, theo xu hướng chính thống, tạo ra một tôn giáo Thời đại Mới khác (một kiểu tổng hợp từ các tôn giáo hiện có). tôn giáo, lấy từ mỗi tôn giáo những gì thích). Lúc đầu, bạn cung cấp các dịch vụ sau: 1. Bói 2. Tử vi tức là. mọi thứ trông như thế này: Tất nhiên là có giao diện dịch vụ với giá cả :) và mô tả
public interface Service {
    public double getPrice();
    public String getLabel();
}
Và dịch vụ
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;
    }
}
Theo đó, 2 mệnh lệnh đã xuất hiện (bói bằng bài Tarot và tử vi cá nhân từ khách hàng):
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);
}
và kết quả của chương trình:
10000.0
Mọi chuyện sẽ ổn thôi, nhưng đã có hàng trăm, nếu không muốn nói là hàng nghìn người như bạn, và chúng ta cần tiếp tục phát triển tâm linh của mọi người, nếu không họ sẽ không còn quan tâm nữa. Do đó, các tùy chọn bổ sung cho các dịch vụ hiện tại đã được cung cấp dưới dạng tùy chọn. Ví dụ: khi chọn dịch vụ bói toán (Tarot hoặc bã cà phê), như một lựa chọn bổ sung, bạn có thể đặt hàng các đặc điểm của luân xa hoặc hào quang (với chi phí riêng cho từng loại). Làm cách nào để triển khai điều này để không thực hiện thay đổi đối với các lớp dịch vụ hiện có, nơi mọi thứ đã được cấu hình và tính toán chính xác. Bạn có thể tạo thêm lớp Bói toán + Luân xa hoặc Bói toán + Hào quang cho Bói toán hiện tại:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
hoặc chỉ sử dụng phân lớp, tức là mở rộng lớp cha sang lớp con
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);
    }
    // Здесь своя стоимость и другие методы
}
Nhưng nhược điểm là thấy ngay, phát triển tâm linh toàn thế giới, chúng ta có thể có thêm những lựa chọn mới, nghĩa là những lớp mới, và nếu vẫn cần kết hợp những cái hiện có thì các lớp sẽ phát triển nhanh chóng, ít nhất là chúng ta không còn nữa. đủ lớp bói toán với hai lựa chọn cùng nhau và không tách rời:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
Đây là nơi bạn có thể sử dụng mẫu Decorator rất “tiết kiệm” trong Java. Để thực hiện việc này, chúng tôi sẽ tạo một lớp cho các tùy chọn bổ sung, lớp này cũng sẽ triển khai Dịch vụ nhưng cũng chứa Dịch vụ. Và theo đó, khi chúng ta cần đặt hàng bói toán và thậm chí có 2 lựa chọn cùng nhau thì sẽ như thế này: Giao diện vẫn như lúc đầu
public interface Service {
    public double getPrice();
    public String getLabel();
}
2 loại dịch vụ, giống như trước:
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;
    }
}
Trang trí cho các tùy chọn bổ sung
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();
    }
}
Và bản thân các tùy chọn (2 cho đến nay):
public class Aura extends OptionDecorator {
    public Aura(Service service) {
        super(service, "Характеристика ауры", 1500);
    }
}
public class Chakra extends OptionDecorator {
    public Chakra(Service service) {
        super(service, "Характеристика чакр", 500);
    }
}
Vâng, chính thứ tự
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
đưa ra kết quả của tổng dịch vụ chính và 2 tùy chọn bổ sung. Điều này có nghĩa là không cần thêm mọi tùy chọn (hoặc kết hợp cả hai) để tạo một lớp mới. Ngoài ra, những lựa chọn này không chỉ có thể áp dụng cho dịch vụ Bói toán mà còn có thể áp dụng cho dịch vụ Tử vi. Do đó, trong tương lai gần, chúng tôi cần triển khai các tùy chọn bổ sung sau: - khả năng tương thích của đối tác hình đại diện trên mạng xã hội - cải thiện dòng tiền thông qua kênh từ xa, chúng tôi sẽ chỉ cần viết thêm 2 lớp:
public class Channeling extends OptionDecorator {
    public Channeling(Service service) {
        super(service, "Полет в Поле Чудес", 99999);
    }
}
public class Avatar extends OptionDecorator {
    public Avatar(Service service) {
        super(service, "Ваша любовь в соц сетях", 5555);
    }
}
và bạn có thể thêm chúng vào bất kỳ dịch vụ nào:
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());
}
và kết quả của chương trình (mà chúng ta cần):
3000.0
106554.0
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION