Mẫu mã sau đây là việc triển khai mẫu Chiến lược copied from Wikipedia. câu hỏi đầy đủ của tôi sau nó ...Mô hình Chiến lược Java này có lớp Ngữ cảnh dư thừa không?
main
phương pháp của Wiki:
//StrategyExample test application
class StrategyExample {
public static void main(String[] args) {
Context context;
// Three contexts following different strategies
context = new Context(new ConcreteStrategyAdd());
int resultA = context.executeStrategy(3,4);
context = new Context(new ConcreteStrategySubtract());
int resultB = context.executeStrategy(3,4);
context = new Context(new ConcreteStrategyMultiply());
int resultC = context.executeStrategy(3,4);
}
}
Các mô hình mảnh:
// The classes that implement a concrete strategy should implement this
// The context class uses this to call the concrete strategy
interface Strategy {
int execute(int a, int b);
}
// Implements the algorithm using the strategy interface
class ConcreteStrategyAdd implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyA's execute()");
return a + b; // Do an addition with a and b
}
}
class ConcreteStrategySubtract implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyB's execute()");
return a - b; // Do a subtraction with a and b
}
}
class ConcreteStrategyMultiply implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyC's execute()");
return a * b; // Do a multiplication with a and b
}
}
// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {
private Strategy strategy;
// Constructor
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}
Xét đặc biệt ví dụ trên, là lớp Context
dư thừa?
Ví dụ: tôi có thể đưa ra cách thực hiện thay thế sau main
bằng cách sử dụng các lớp và giao diện hiện có ngoại trừ Ngữ cảnh và nó sẽ hoạt động giống hệt nhau. Nó vẫn còn lỏng lẻo.
((Chỉnh sửa: Trong kịch bản đơn giản này, khi tôi bỏ qua lớp Context, sẽ tôi được thực hiện một sai lầm tương lai))
public static void main(String[] args) {
IStrategy strategy;
// Three strategies
strategy = new ConcreteStrategyAdd();
int resultA = strategy.executeStrategy(3,4);
strategy = new ConcreteStrategySubtract();
int resultB = strategy.executeStrategy(3,4);
strategy = new ConcreteStrategyMultiply();
int resultC = strategy.executeStrategy(3,4);
}
Tóm tắt Cập nhật
Danh sách dưới dạng điểm được phát hiện qua câu trả lời và nhận xét:
- Bối cảnh cho phép thay đổi về cách sử dụng Chiến lược tổng hợp (ví dụ: thời gian của cuộc gọi của nó). Các bối cảnh khác nhau có thể làm các công việc nội bộ khác nhau trước và sau khi gọi Chiến lược đã cho.
- Ngữ cảnh là "hộp đen" cấp cao. Logic bối cảnh có thể thay đổi, cũng là Chiến lược tổng hợp có thể thay đổi (hoặc một chiến lược khác được sử dụng) mà không làm hỏng máy khách vì máy khách chỉ hiểu cách gọi ngữ cảnh.
- Mặc dù tôi đã tạo một triển khai thay thế mã mẫu Wikipedia bằng cách bỏ ngữ cảnh, và mặc dù nó hoạt động giống như bản gốc, toàn bộ tình huống đã được đơn giản hóa (trong cả hai trường hợp) và thay đổi của tôi thực sự có nghĩa là: không phải là một mẫu Chiến lược nữa, 2. Tôi nhớ những lợi ích của tinh thần của mô hình Chiến lược được đề cập ở đây.
- Triển khai thay thế của tôi đã sử dụng phương pháp chính như Ngữ cảnh, vì vậy tôi cũng có thể giữ ngữ cảnh nếu mô phỏng hiệu quả nó. Bằng cách tạo ra một mẫu Chiến lược không tinh khiết, sự nhầm lẫn đã được tạo ra. Tôi không cần phải tái tạo lại bánh xe hoặc cố gắng thông minh hơn (trong trường hợp này).
Nếu bất kỳ điểm nào khác hữu ích hoặc nếu điều này cần chỉnh sửa để lại nhận xét và tôi sẽ sửa đổi danh sách tương ứng.
Đây là một lời giải thích chi tiết kỹ lưỡng nêu rõ tầm quan trọng của bối cảnh, bao gồm cả mẫu mã hỗ trợ. Tuyệt quá. –
Tôi cho rằng thêm một lớp Ngữ cảnh có thể được phân lớp để gắn thêm hành vi vào công việc ngữ cảnh cơ sở (tức là gọi lại xử lý ngữ cảnh cơ sở trước khi thực hiện công việc bổ sung). Điều tương tự cũng có thể được thực hiện với bất kỳ chiến lược cụ thể nào. Điều này sẽ cho phép các phần thay đổi hành vi độc lập với nhau nhưng vẫn tương thích với các kiểu cơ sở. Vì vậy, tôi bắt đầu nhận ra có rất nhiều tính linh hoạt cả theo chiều ngang thông qua việc triển khai thay thế và theo chiều dọc thông qua kế thừa, cũng là sự kết hợp của những thứ đó. Hấp dẫn. Mọi thứ cũng có thể phức tạp nhanh nếu không nghĩ ra. –
Hmm. Tôi không chắc chắn tôi thích ý tưởng của một 'Đa ngữ' đa hình. IMO, sẽ tốt hơn khi soạn các phần khác nhau thành một 'Ngữ cảnh 'mạch lạc duy nhất, và sau đó có các chiến lược thích hợp cho mỗi trường hợp có thể áp dụng. –