2014-04-08 13 views
6

Mẫu lệnh là để đóng gói các lệnh trong các đối tượng. Nhưng tại sao không sử dụng con trỏ hàm thay thế. Tại sao tôi cần phải phân lớp lớp Command cho mỗi hoạt động? Thay vào đó, tôi có thể có các chức năng khác nhau và gọi các chức năng đó lưu trữ các con trỏ và cứ thế ...Mẫu lệnh - tại sao lại đóng gói trong một đối tượng

Trả lời

9

Nhưng tại sao không sử dụng con trỏ hàm thay thế.

Do con trỏ hàm không thể lưu trữ trạng thái tùy ý. Bạn sẽ thường xuyên muốn lệnh được parametrised khi bạn tạo nó. Ví dụ:

struct command { 
    virtual ~command() {} 
    virtual void do_it() = 0; 
}; 

struct say_something : command { 
    // store a message to print later 
    say_something(std::string message) : message(message) {} 

    // print the stored message 
    void do_it() override {std::cout << message << '\n';} 

    std::string message; 
}; 

std::unique_ptr<command> say_hello(new say_something("Hello!")); 

// later 

say_hello->do_it(); // prints stored string 

Nếu bạn sử dụng con trỏ hàm, bạn cần có chức năng khác cho mọi thứ bạn có thể muốn in.

Tại sao tôi cần phải phân lớp lớp Lệnh cho mỗi thao tác?

Bởi vì đó là cách OOP cũ-trường làm việc; mặc dù như đã đề cập ở trên, bạn có thể sử dụng thực tế rằng nó là một đối tượng để parametrise nó hơn là subclass nó.

May mắn thay, hiện đại C++ có cơ sở vật chất tốt hơn:

typedef std::function<void()> command; 

// print a static string 
command say_hello = []{std::cout << "Hello!\n";}; 

// store a string to print later 
std::string goodbye = "Goodbye!"; 
command say_goodbye = [goodbye]{std::cout << goodbye << '\n';}; 

// later 

say_hello(); // prints static string 
say_goodbye(); // prints string stored in the command 
+0

Trích dẫn "Nếu bạn sử dụng một con trỏ hàm đơn giản, thì bạn sẽ cần một hàm khác cho mọi thứ bạn có thể muốn in." Nhưng bạn không phải làm vậy. Bạn có thể gọi hàm với các tham số khác nhau, khi bạn tạo một lệnh với các đối số khác nhau. – Narek

+3

@Narek nhưng mẫu Lệnh không cho phép bạn cung cấp đối số khi bạn gọi lệnh, chỉ khi bạn tạo ra nó. Vì vậy, bạn cần một đối tượng để lưu trữ chúng để chúng có sẵn khi được gọi. –

4

mẫu Command là nhiều hơn chỉ cần thực hiện một chức năng. Nó đóng gói dữ liệu và logic bên trong một lớp và cung cấp một đối tượng có thể dễ dàng được truyền như một tham số. Bên cạnh việc thực thi các nhiệm vụ, nó cũng có thể kích hoạt các sự kiện, phân tích và dọn sạch dữ liệu và nhiều hơn nữa, và đó là nơi các phương thức thừa kế và mẫu trở nên tiện dụng, bạn sẽ không sử dụng các con trỏ hàm. Ngoài ra, thực hiện hoàn tác và làm lại là rất dễ dàng bằng cách sử dụng lệnh.

+0

+1 cho kế thừa, hoàn tác và làm lại (nhiều chức năng liên quan đến lệnh) và đóng gói dữ liệu (tức là trạng thái) – Narek

Các vấn đề liên quan