Tôi muốn tạo một lớp có thể sử dụng một trong bốn thuật toán (và thuật toán sử dụng chỉ được biết trong thời gian chạy). Tôi đã nghĩ rằng mẫu thiết kế Chiến lược có vẻ phù hợp, nhưng vấn đề của tôi là mỗi thuật toán đòi hỏi các tham số hơi khác nhau. Nó sẽ là một thiết kế xấu để sử dụng chiến lược, nhưng vượt qua trong các tham số có liên quan vào constructor ?.Mẫu thiết kế nào phù hợp nhất?
Dưới đây là một ví dụ (vì đơn giản, giả sử chỉ có hai thuật toán có thể) ...
class Foo
{
private:
// At run-time the correct algorithm is used, e.g. a = new Algorithm1(1);
AlgorithmInterface* a;
};
class AlgorithmInterface
{
public:
virtual void DoSomething() = 0;
};
class Algorithm1 : public AlgorithmInterface
{
public:
Algorithm1(int i) : value(i) {}
virtual void DoSomething(){ // Does something with int value };
int value;
};
class Algorithm2 : public AlgorithmInterface
{
public:
Algorithm2(bool b) : value(b) {}
virtual void DoSomething(){ // Do something with bool value };
bool value;
};
Thay vì cố gắng phù hợp với mã của bạn thành một số mẫu giả định, chỉ cần thiết kế nó rõ ràng nhất cho bạn (và hy vọng rõ ràng nhất đối với mọi người) và dễ bảo trì nhất. Nói cách khác: các mẫu thiết kế hút. Nếu * bạn * tìm cách thanh lịch để giải quyết vấn đề, hãy sử dụng nó; có hay không vi phạm một số mẫu thiết kế tùy ý là không liên quan. – GManNickG
Ngoài ra, nếu bạn cung cấp cho chúng tôi nhiều hơn một chút (các tham số này được thông qua như thế nào, v.v.), chúng tôi có thể cung cấp cho bạn câu trả lời tốt hơn. Nhưng dường như nó có vẻ như là một giải pháp tốt cho tôi. – GManNickG