2008-08-18 25 views
13

Tôi đang làm việc trên ứng dụng WinForm .Net với giao diện người dùng cơ bản bao gồm các nút trên thanh công cụ, các mục menu và tổ hợp phím mà tất cả đều bắt đầu cùng một mã cơ bản. Ngay bây giờ các trình xử lý sự kiện cho mỗi phương thức này gọi một phương thức chung để thực hiện hàm.Tìm kiếm ví dụ về mẫu lệnh cho giao diện người dùng

Từ những gì tôi đã đọc loại hành động này có thể được xử lý bởi Command design pattern với lợi ích bổ sung của tự động bật/tắt hoặc kiểm tra/bỏ chọn các yếu tố giao diện người dùng.

Tôi đã tìm kiếm trên mạng cho một dự án mẫu tốt, nhưng thực sự chưa tìm thấy. Có ai có một ví dụ tốt mà có thể được chia sẻ?

Trả lời

16

Hãy tiên hãy chắc chắn chúng ta đều biết những gì các mẫu Command là:

mẫu Command gói gọn một yêu cầu như một đối tượng và cung cấp cho nó một nổi tiếng public interface. Mẫu lệnh đảm bảo rằng mọi đối tượng đều nhận được các lệnh riêng của mình và cung cấp số tách giữa người gửi và người nhận. Người gửi là một đối tượng gọi hoạt động và người nhận là đối tượng nhận được yêu cầu và hành động theo số .

Đây là ví dụ cho bạn. Có nhiều cách bạn có thể làm điều này, nhưng tôi sẽ thực hiện một phương pháp tiếp cận cơ sở giao diện để làm cho mã có thể kiểm tra được nhiều hơn cho bạn. Tôi không chắc chắn ngôn ngữ bạn thích, nhưng tôi đang viết điều này trong C#.

Trước tiên, hãy tạo giao diện mô tả Lệnh.

public interface ICommand 
{ 
    void Execute(); 
} 

Thứ hai, tạo các đối tượng lệnh sẽ triển khai giao diện lệnh.

public class CutCommand : ICommand 
{ 
    public void Execute() 
    { 
     // Put code you like to execute when the CutCommand.Execute method is called. 
    } 
} 

Thứ ba, chúng ta cần thiết lập đối tượng người gọi hoặc người gửi.

public class TextOperations 
{ 
    public void Invoke(ICommand command) 
    { 
     command.Execute(); 
    } 
} 

Thứ tư, tạo đối tượng khách hàng sẽ sử dụng đối tượng người gửi/người gửi.

public class Client 
{ 
    static void Main() 
    { 
     TextOperations textOperations = new TextOperations(); 
     textOperation.Invoke(new CutCommand()); 
    } 
} 

Tôi hy vọng bạn có thể lấy ví dụ này và đưa vào sử dụng cho ứng dụng bạn đang làm việc. Nếu bạn muốn làm rõ thêm, hãy cho tôi biết.

2

Bạn đang đi đúng hướng. Về cơ bản bạn sẽ có một mô hình đại diện cho tài liệu. Bạn sẽ sử dụng mô hình này trong CutCommand. Bạn sẽ muốn thay đổi constructor của CutCommand để chấp nhận thông tin bạn muốn cắt. Sau đó, mọi lúc, nhấn nút Cut, bạn gọi một CutCommand mới và truyền các đối số trong hàm tạo. Sau đó, sử dụng các đối số đó trong lớp khi phương thức Execute được gọi.

1

Qt sử dụng mẫu lệnh cho thanh menu/thanh công cụ.

QActions được tạo riêng biệt từ QMenuItem và QToolbar và Hành động có thể được gán cho QMenuItem và QToolbar với phương thức setAction() và addAction() tương ứng.

http://web.archive.org/web/20100801023349/http://cartan.cas.suffolk.edu/oopdocbook/html/menus.html

http://web.archive.org/web/20100729211835/http://cartan.cas.suffolk.edu/oopdocbook/html/actions.html

+0

Tôi nhận ra bài đăng là 4 năm trước, để giải thích điều đó. Nhưng cả hai liên kết đều bị hỏng. –

+1

Liên kết bị hỏng thay thế bằng liên kết đến bản sao lưu trữ của họ.org – Imran

0

tôi không thể giúp bạn với ví dụ liên kết, nhưng có thể cung cấp ví dụ bằng cách bản thân mình.

1) Xác định giao diện ICommand:

public interface ICommand { 
    void Do(); 
    void Undo(); 
} 

2) Do việc triển khai ICommand của bạn cho các lệnh cụ thể, mà còn xác định lớp cơ sở trừu tượng đối với họ:

public abstract class WinFormCommand : ICommand { 

} 

3) Tạo lệnh Invoker:

public interface ICommandInvoker { 
    void Invoke(ICommand command); 
    void ReDo(); 
    void UnDo(); 
} 

public interface ICommandDirector { 
    void Enable(ICommand); 
    void Disable(ICommand); 
} 

public class WinFormsCommandInvoker : ICommandInvoker, ICommandDirector { 

    private readonly Dictionary<ICommand, bool> _commands; 
    private readonly Queue<ICommand> _commandsQueue;  
    private readonly IButtonDirector _buttonDirector; 

    // you can define additional queue for support of ReDo operation 

    public WinFormsCommandInvoker(ICommandsBuilder builder, IButtonDirector buttonDirector) { 
     _commands = builder.Build(); 
     _buttonDirector = buttonDirector; 
     _commandsQueue = new Queue<ICommand>(); 
    } 

    public void Invoke(ICommand command) { 
     command.Do(); 
     __commandsQueue.Enqueue(command); 
    } 

    public void ReDo() { 
     //you can implement this using additional queue 
    } 

    public void UnDo() { 
     var command = __commandsQueue.Dequeue(); 
     command.Undo(); 
    } 

    public void Enable(ICommand command) { 
     _commands.[command] = true; 
     _buttonDirector.Enable(command); 
    } 

    public void Disable(ICommand command) { 
     _commands.[command] = false; 
     _buttonDirector.Disable(command); 
    } 
} 

4) Bây giờ bạn có thể triển khai ICommandsBuilder, IButtonDirect của mình hoặc và thêm các giao diện khác như ICheckBoxDirector vào WinFormsCommandInvoker.