JavaRush /Blog Java /Random-VI /Chiến lược mẫu (Chiến lược)

Chiến lược mẫu (Chiến lược)

Xuất bản trong nhóm
Mẫu Chiến lược xác định một nhóm thuật toán, đóng gói từng thuật toán và đảm bảo rằng chúng có thể thay thế cho nhau. Nó cho phép các thuật toán được sửa đổi độc lập với việc sử dụng chúng ở phía máy khách (định nghĩa này được lấy từ cuốn sách “Head First. Design Patterns” của Eric Freeman và Elizabeth Robson). Định nghĩa này có vẻ hơi khó hiểu nên chúng ta cần giải thích định nghĩa này chi tiết hơn bằng ngôn ngữ thông thường . Hãy bắt đầu với tôn giáo :) Có rất nhiều tôn giáo trên thế giới (tín ngưỡng, phong trào, tín ngưỡng, v.v.). Làm cách nào chúng tôi có thể mô tả điều này bằng mã. Chà, ví dụ, chúng ta có thể lấy lớp Tôn giáo và kế thừa các tôn giáo khác từ lớp đó. Hãy loại bỏ những thứ không cần thiết và sử dụng một phương thức Believe() trong lớp Tôn giáo.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Tất cả các tôn giáo khác có thể được kế thừa từ lớp này. Nếu chúng tôi giới hạn mình trong Cơ đốc giáo, thậm chí cả Hồi giáo và Do Thái giáo, thì sẽ không có vấn đề gì.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
Nhưng nếu bạn nghĩ về những tôn giáo khác hiện đang tồn tại (hoặc đã tồn tại trước đây nhưng đã biến mất), thì sẽ có vấn đề nảy sinh, ít nhất là với những người theo đạo Phật. Bạn sẽ phải ghi đè phương pháp tin tưởng của họ.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
Và vì có nhiều tôn giáo và họ thậm chí còn tin vào quái vật mì ống (Chủ nghĩa Pastafarianism), nên trong tất cả các tôn giáo này, bạn sẽ phải xác định lại phương pháp tin tưởng. Nhưng chúng ta có thể làm khác đi không, chuyển phương thức này sang giao diện Faith và triển khai phương thức Believe trong đó cũng như triển khai phương thức này trong mỗi lớp (và theo đó triển khai nó trong mỗi lớp theo ý muốn)? Nhưng sau đó chúng ta sẽ nhận được sự sao chép mã, ít nhất là giữa người Do Thái và Cơ đốc giáo. Người Hồi giáo của Chúa có thể viết bằng tiếng Ả Rập.
public interface Faith {
    public void believe();
}
public class Christianity implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class Judaism implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Việc triển khai phương thức mặc định ở đây sẽ không giúp ích gì nhiều, có rất nhiều tôn giáo đến nỗi ngay cả khi bạn xác định phương thức này theo mặc định trong giao diện Faith, bạn sẽ phải triển khai phương thức này theo cách riêng của mình trong tất cả các tôn giáo không độc thần và lặp lại nó một vài nơi. Mẫu Chiến lược cung cấp cho chúng ta điều gì trong trường hợp này: nó cung cấp khả năng tạo các lớp mẫu làm sẵn cho giao diện hiện tại, sau đó sẽ được thay thế thành hàm tạo của một tôn giáo cụ thể. Những thứ kia. xác định và tạo cùng một nhóm thuật toán đã được đề cập ở phần đầu của định nghĩa.
public interface Faith {
    public void believe();
}
public class AbrahamicReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class BuddismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    }
}
public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
Và trong mỗi lớp trong hàm tạo, hãy thay thế chúng.
public abstract class Religion {
    Faith faith;
}
public class Judaism extends Religion{

    public Judaism() {
        this.faith = new AbrahamicReligion();
    }
}
public class Christianity extends Religion{

    public Christianity() {
        this.faith = new AbrahamicReligion();
    }
}
public class Buddhism extends Religion {

    public Buddhism() {
        this.faith = new BuddismReligion();
    }
}
Do đó, nếu bạn cần đưa một tôn giáo khác vào dự án của mình, bạn sẽ không phải xác định lại phương pháp tin tưởng cho tất cả các lớp hoặc các bộ phận của lớp. Và bạn sẽ chỉ cần triển khai lớp còn thiếu (nếu chưa có) để triển khai giao diện Faith và thêm lớp này vào hàm tạo của tôn giáo mới.
public class PastafarianismReligion implements Faith{

    @Override
    public void believe() {
        System.out.println("Кто съел мои макароны???");
    }
}
public class Pastafarianism extends Religion {

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION