Lớp ngữ cảnh trong mẫu Chiến lược


10

Tôi đang cố gắng để hiểu mô hình chiến lược và tự hỏi: lớp bối cảnh phải có hoặc tôi có thể loại bỏ nó mà không ảnh hưởng đến mục đích của mô hình không?

Tôi có ấn tượng rằng tôi cần một loại công tắc để đọc các loại tệp khác nhau nhưng không muốn hack thứ gì đó và sau đó xử lý tái cấu trúc (mặc dù, tất nhiên luôn xảy ra mã có thể được cấu trúc lại nhưng ý tưởng là: thử thông minh nhất có thể trong thiết kế trước đó ...):

nhập mô tả hình ảnh ở đây

Hình ảnh được lấy từ wikidia

Khách hàng có thể ủy quyền trực tiếp cho giao diện Chiến lược không hoặc có điều gì tôi vừa bỏ lỡ để hiểu về lớp ngữ cảnh không?

interface Reader {
    // read information from file and fill data list field of Client
    readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}

class Client{
    // strategic choice
    Reader r;

    // data list field
    List<Data> data;

    // Client Constructor
    public Client(){
        if(<file ends in .xls>)
            r = new ExcelReader();
        else
            r = new PdfReader();
        r.readFile();
    }
}

Vì vậy, ở trên mô tả là lớp bối cảnh bị thiếu. Liệu mã có tuân thủ mô hình chiến lược?


1
Như một điểm thú vị / quan trọng khác, tôi muốn nói với bạn rằng khái niệm các lớp loại trong các ngôn ngữ chức năng là "đơn giản" mẫu chiến lược với các loại en.wikipedia.org/wiki/Kind_(type_theory) ). Cả hai chỉ là một cơ chế thực hiện cho đa hình ad-hoc.
AndreasScheinert

Điều này (xa hay ít hơn) có liên quan đến Dự án Java 8 Lambda? Bài viết Wikipedia quá dày đặc đối với tôi chỉ cần hiểu ngay lập tức nhưng nếu đây là một phần của nền tảng lý thuyết để sử dụng hiệu quả các tính năng sắp tới của Java (hoặc lập trình nói chung), tôi sẽ vui vẻ đầu tư nhiều thời gian hơn vào nó.
panny

1
Rất xa nhưng tôi sẽ tranh luận là có, loại lớp cần. Một ngôn ngữ lập trình hỗ trợ các loại cao hơn. Đó sẽ là trường hợp của scala và Haskell. Quan điểm của tôi ở đây là tính đa hình (ad hoc) được triển khai khác đi và nếu bạn lùi lại, bạn có thể tìm hiểu một số hiểu biết về đa hình nói chung.
AndreasScheinert

Câu trả lời:


13

Trong ví dụ của bạn, việc gọi mã readFilelà một phần của hàm tạo của Máy khách. Phương pháp đó là "bối cảnh" bạn đang tìm kiếm . Mẫu chiến lược không cần "lớp ngữ cảnh" theo nghĩa đen và ở phiên bản đầu tiên của mã của bạn, đối tượng chiến lược ("Trình đọc" trong trường hợp của bạn) có thể chỉ nằm trong một biến cục bộ. Đặc biệt là khi chỉ có một "phương thức chiến lược" ("readFile") được gọi.

Tuy nhiên, nếu cơ sở mã của bạn phát triển từ phiên bản này sang phiên bản tiếp theo, không có khả năng ngày càng có nhiều phương thức "chiến lược" được gọi, và quyết định áp dụng chiến lược nào và thực hiện "phương pháp chiến lược" sẽ xảy ra vào những thời điểm khác nhau và tại những nơi khác nhau trong mã của bạn. Vì vậy, bạn bắt đầu cấu trúc lại chúng để giữ logic ở một nơi. Điều này sẽ dẫn thẳng đến một triển khai trông tương tự như sơ đồ trong câu hỏi của bạn.


5

Chắc chắn rồi. Các mẫu chỉ là hướng dẫn. Bạn vẫn sẽ cần phải điều chỉnh và áp dụng chúng một cách chính xác cho vấn đề hiện tại. Cá nhân, tôi hiếm khi cho phép chiến lược được thiết lập khi chạy; thường xuyên hơn nó được chỉ định về xây dựng hoặc xuất hiện trong một nhà máy.

Mặc dù nó cũng có thể được tranh luận setStrategylà riêng tư và tiêm của tôi chỉ sử dụng mô hình như được hiển thị.


Điều này có nghĩa là lớp Ngữ cảnh được mô tả có thể bị bỏ qua mà không ảnh hưởng đến mẫu không? Hoặc đặt một cách khác, nó có ổn không khi lớp khách hàng của tôi lớp bối cảnh được mô tả?
panny

6
@panny - Tôi ngần ngại trả lời câu hỏi vì nó cho biết bạn đã bỏ lỡ điểm của câu trả lời và thực sự hoàn toàn là các mẫu. Mẫu chiến lược cho phép bạn thay đổi hành vi bằng cách cung cấp các triển khai cụ thể khác nhau đằng sau một giao diện. Nó là một khái niệm , không phải là một công thức .
Telastyn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.