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
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
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.
+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
- 1. Đối tượng đóng gói
- 2. Tại sao đối tượng Enum.Parse() trả lại?
- 3. Bảo mật đóng gói đối tượng Python
- 4. Tại sao Convert.ChangeType lại lấy một tham số đối tượng?
- 5. - Bin-đóng gói, sắp xếp thùng để đóng gói các đối tượng n
- 6. Cố gắng mở lại một đối tượng đã đóng: java.lang.IllegalStateException :?
- 7. Chuyển đối tượng Java vào mẫu đóng?
- 8. cố gắng mở lại một đối tượng đã đóng: SQLiteDatabase
- 9. Tại sao mẫu thiết kế đối tượng truy vấn
- 10. Đóng gói cuộc gọi dịch vụ trong một phương thức đối tượng miền
- 11. Tại sao đối tượng mẫu Meteor không được xác định?
- 12. Gói Google App Engine "đóng gói lại"
- 13. Ruby: Tại sao Array.sort lại làm chậm đối tượng lớn?
- 14. Tại sao == đúng đối với một số đối tượng Integer?
- 15. Tại sao gói webpack lại là 'System.register'
- 16. Tại sao tôi nhận được một đối tượng không phải là lỗi lặp lại?
- 17. Tại sao ListObjects trả lại tiền tố dưới dạng một đối tượng riêng biệt trong mảng?
- 18. Tại sao tôi không thể trả lại tham chiếu đến trường được đóng gói?
- 19. Tại sao tôi phải Đóng() một tệp trong C#?
- 20. Đóng gói CSS và Tập lệnh trong ứng dụng Biểu mẫu web
- 21. Tại sao lại sử dụng các phương thức công khai trong các đối tượng JavaScript?
- 22. Tại sao một đối tượng có thể lặp lại không phải là một trình lặp?
- 23. Chức năng đóng gói C++ mẫu
- 24. Mẫu JNI tốt nhất để gói các đối tượng C++?
- 25. Đóng gói một ứng dụng dòng lệnh để phân phối?
- 26. Cách đóng gói một mảng trong Java
- 27. C# Tại sao form.Close() không đóng biểu mẫu?
- 28. Tại sao tôi đóng gói một hàm jQuery trong jQuery (hàm ($) {});
- 29. Đang gọi phương thức tĩnh thông qua một đối tượng "biểu mẫu xấu"? Tại sao?
- 30. Khi sử dụng một Mẫu Builder tại sao tôi không nên sử dụng lại đối tượng trình xây dựng để truy cập cấu hình đối tượng?
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
@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. –