2009-04-14 34 views
5

Trên tất cả mã nguồn của chúng tôi, chúng tôi có mẫu lặp lại này, nơi có giao diện với một phương pháp. Đây có phải là mẫu thiết kế thực không? Nếu vậy nó là gì và lợi ích sẽ là gì?Đây có phải là mẫu thiết kế không?

Dưới đây là một vài ví dụ:

public interface IRunnable 
    {  
     void Run();  
    } 

    public interface IAction 
    { 
     void Perform(); 
    } 

    public interface ICommand 
    { 
     void Execute(ActionArgs _actionargs); 
    } 

Trả lời

5

Tôi đã nhìn thấy này tham chiếu như Command pattern.

Lần đầu tiên tôi biết về nó khi đọc số Agile Principles, Patterns, and Practices in C# của Bác Bob.

Tôi tin rằng sự thanh lịch của nó là sự đơn giản của nó. Tôi đã sử dụng nó khi tôi viết một dịch vụ xử lý tệp. Dịch vụ thực hiện tất cả quản trị đọc/xóa tệp. Khi một tệp cần được xử lý, plugin tương ứng của nó đã được tải. Mỗi plugin đã triển khai phương thức Process và đã thực hiện mọi thứ cần thiết để xử lý loại tệp đó. (Chủ yếu, phân tích nội dung và chèn vào cơ sở dữ liệu.)

Mỗi lần tôi phải xử lý loại tệp mới với bố cục mới, tất cả những gì tôi phải làm là tạo một Plugin mới được triển khai Process.

Điều này phù hợp với tôi vì tôi cần một giải pháp đơn giản. Nếu bạn cần tham gia nhiều hơn một tham số, điều này có lẽ không phải là mẫu để sử dụng.

2

Bất kỳ trường hợp nào trong số này cũng có thể là trường hợp cụ thể của Command Pattern, tùy thuộc vào cách nó được sử dụng và ngữ cảnh. Một phần của điều này sẽ phụ thuộc vào lý do tại sao và làm thế nào bạn đang thiết lập này lên.

Mẫu lệnh cũng thường bao gồm khái niệm trạng thái và các đối tượng khác nhau. Thông thường, loại giao diện này sẽ gợi ý rằng, vì vậy tôi đoán đây là những gì bạn đang nghĩ đến như là một mẫu thiết kế ở đây, nhưng không có người gọi hoặc nhiều mục tiêu khó có thể biết đây có phải là một ví dụ điển hình hay không. ..

Tuy nhiên, điều này, trong và của chính nó, chỉ là giao diện cơ bản trừu tượng với tôi, và không phải cái gì tôi muốn phân loại như là một mẫu thiết kế.

1

Tôi không chắc liệu bạn có thể gọi nó là mẫu thiết kế vì giao diện bạn cung cấp không cung cấp giải pháp cho các vấn đề thường gặp phải nhưng giải pháp cho các vấn đề rất cụ thể trong dự án mà bạn đang phát triển.

Lý do bạn sử dụng giao diện đúng là do bạn không thể có tất cả các lớp cần các phương thức này mở rộng lớp cơ sở chứa các lớp này, nhưng bạn cần biết rằng các lớp cụ thể hứa sẽ triển khai các lớp này.

Có thể, như một số các áp phích trước đề nghị: http://en.wikipedia.org/wiki/Command_pattern

1

Bạn có thể loại bỏ sự lặp lại này (hoặc ngăn chặn nó cho mã tương lai) bằng cách sử dụng các biểu thức lambda. Biểu thức Lambda chính xác cho tình huống này.

1

Nếu có, thì đó là một hàm. Nó được sử dụng trong các ngôn ngữ không có hàm lớp đầu tiên (con trỏ) cho các loại hàm (con trỏ) được sử dụng cho, chẳng hạn như hàm chính cho một luồng.

1

Có các ứng dụng cho Giao diện chỉ bằng một phương pháp. Tôi có nghĩa là, trong .NET có rất nhiều - INotifyPropertyChanged, cho một (sự kiện PropertyChanged). Nó chỉ đảm bảo rằng một đối tượng có một phương thức nhất định (bất kể loại đối tượng đó thực sự là gì), vì vậy bạn có thể gọi nó (một lần nữa, bất kể loại).

Dim runnableObjects As List(Of Object) 
runnableObjects.Add(New MyRunnableObject1) 
runnableObjects.Add(New MyRunnableObject2) 

For Each o As IRunnable In runnableObjects 
    o.Run() 
Next 
2

Như đã nói, nó là Command Design Pattern. Nhưng đó là (đối với tôi) giống như cách Java để đạt được kết quả. Trong C#, bạn có thể sử dụng các delegate và trong các hàm con trỏ và hàm F ++.

Không có ý nghĩa lớn để tạo nhiều lớp hơn và nhiều hơn nữa nếu bạn đã có một số triển khai phản ứng trong một phương thức Class nào đó. Mà bạn có thể ràng buộc trong C + + hoặc thiết lập để đại biểu trong C#. Trong Java, tôi cho rằng bạn không có lựa chọn nào khác ngoài viết mã bạn đã tìm thấy.

0

Có thể tôi đang thiếu thứ gì đó, nhưng cái đầu tiên trông giống như chúng có thể là một phần của strategy pattern. Về cơ bản, một đối tượng có một thành viên của kiểu IAction, và thành viên đó được gán/gán lại vào thời gian chạy dựa trên nhu cầu của hệ thống để thực hiện một nhiệm vụ theo một cách cụ thể (tức là sử dụng một chiến lược cụ thể).

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