Tôi cần tạo mẫu chiến lược trong đó người dùng chọn bốn chiến lược từ danh sách hai mươi hoặc ba mươi đối tượng chiến lược duy nhất. Danh sách các chiến lược sẽ được mở rộng khi dự án đáo hạn và người dùng có thể thay đổi chiến lược đã chọn của họ bất kỳ lúc nào.Mã này có quá giòn không?
Tôi dự định lưu trữ tên chiến lược mà họ đã chọn làm chuỗi và sau đó sử dụng phương pháp như thế này để tải các lớp chiến lược tương ứng với chuỗi họ đã chọn.
class StrategyManager { // simplified for the example
public $selectedStrategies = array();
public function __construct($userStrategies) {
$this->selectedStrategies = array(
'first' => new $userStrategies['first'],
'second' => new $userStrategies['second'],
'third' => new $userStrategies['third'],
'fourth' => new $userStrategies['fourth']
);
}
public function do_first() {
$this->selectedStrategies['first']->execute();
}
public function do_second() {
$this->selectedStrategies['second']->execute();
}
public function do_third() {
$this->selectedStrategies['third']->execute();
}
public function do_fourth() {
$this->selectedStrategies['fourth']->execute();
}
}
Tôi đang cố gắng tránh tuyên bố chuyển đổi lớn. Mối quan tâm của tôi là điều này có vẻ như là Stringly Typed
. Có cách nào tốt hơn để hoàn thành mục tiêu này mà không sử dụng câu lệnh chuyển đổi có điều kiện hoặc chuyển đổi lớn không?
BTW: Người dùng không nhập chuỗi khi chọn bốn chiến lược. Tôi sẽ cần phải duy trì một danh sách các chuỗi để trình bày cho người dùng trong một hộp chọn và thêm các chuỗi mới vào danh sách khi tôi thêm các đối tượng chiến lược mới.
Giải thích
ircmaxell bày tỏ một chút nhầm lẫn về những gì nó là tôi đang cố gắng để làm. Trong ví dụ trên, người dùng đã chọn bốn chiến lược từ một danh sách và chúng được chuyển tới hàm tạo của StrategyManager dưới dạng một chuỗi các chuỗi. Các đối tượng chiến lược tương ứng được tạo và lưu trữ trong mảng nội bộ, $this->selectedStrategies
"đầu tiên", "thứ hai", "thứ ba" và "thứ tư" là các khóa mảng của mảng nội bộ cho bốn chiến lược được chọn khác nhau. Sau khi đối tượng StrategyManager được xây dựng, ứng dụng sử dụng phương thức execute
của bốn chiến lược trong những khoảnh khắc khác nhau trong suốt quá trình của quá trình.
Vì vậy, tóm lại ... mỗi khi ứng dụng cần thực thi phương pháp Chiến lược số "một", và kết quả khác nhau tùy thuộc vào chiến lược nào được người dùng chọn cho Chiến lược "một"
Tôi đang bối rối. Chiến lược "đầu tiên", "thứ hai", "thứ ba" và "thứ tư" có thể khác nhau hoặc chúng là một loạt các lệnh cho chiến lược đã chọn (được chọn trước khi xây dựng trình quản lý). Và nếu có, mô hình [Chain of Responsibility] (http://sourcemaking.com/design_patterns/chain_of_responsibility) hay [Command] (http://sourcemaking.com/design_patterns/command) có hoạt động tốt hơn không? Bạn có thể giải thích chính xác những gì bạn đang cố gắng làm (và những gì mã không, tại sao các chiến lược khác nhau tồn tại)? – ircmaxell
Tôi sẽ cập nhật câu hỏi. – Stephen
Luôn có 4 chiến lược? Và chúng luôn luôn được thực hiện theo thứ tự? Hay họ là bốn chiến lược không liên quan đến nhau mà bạn đang cố gắng quản lý cùng nhau? – ircmaxell