2010-03-31 35 views
5

Tôi đang nghĩ để tạo đối tượng bộ lọc để lọc và xóa mọi thứ như thẻ html khỏi ngữ cảnh. Nhưng tôi muốn nó độc lập, có nghĩa là mẫu thiết kế tôi có thể áp dụng sẽ giúp tôi thêm nhiều bộ lọc hơn trong tương lai mà không ảnh hưởng đến các mã hiện tại. Tôi nghĩ Tóm tắt nhà máy nhưng có vẻ như nó sẽ không làm việc theo cách tôi muốn. Vì vậy, có thể xây dựng nhưng nó trông giống nhau. Tôi không biết tôi là kinda nhầm lẫn, một số xin vui lòng giới thiệu cho tôi một mẫu thiết kế mà có thể giải quyết vấn đề của tôi, nhưng trước đó cho tôi xây dựng vấn đề một chút.Đề xuất mẫu thiết kế để lọc tùy chọn

Cho phép nói rằng tôi có một lớp học có trường Mô tả hoặc thuộc tính bao giờ. Và tôi cần bộ lọc loại bỏ những thứ tôi muốn từ thuộc tính Mô tả này. Vì vậy, bất cứ khi nào tôi áp dụng bộ lọc, tôi có thể thêm bộ lọc khác trong lớp cơ bản. Vì vậy, thay vì phải chạm lại vào trường Mô tả, tôi có thể dễ dàng thêm nhiều bộ lọc hơn và tất cả các bộ lọc sẽ chạy cho trường Mô tả và xóa mọi thứ mà chúng được cho là xóa khỏi ngữ cảnh Mô tả.

Tôi hy vọng tôi có thể mô tả sự cố của mình. Tôi nghĩ một số bạn đã gặp phải tình huống tương tự trước đây.

Cảm ơn trước ...

Edit:

Tôi thực sự muốn tạo bộ lọc như các loại/classes thay vì phương pháp thông thường hoặc bất cứ điều gì. Giống như:

class TextFilter : IFilter 
{ 
    private string something; 
    public string Awesome {get;set;} 
    public string FilterYo(string textFiltered) 
    { 
     // Do filtering 
    } 
} 

class HtmlFilter : IFilter 
{ 
    private string something; 
    private string iGotSomething; 
    public string Awesome {get;set;} 
    public string FilterYo(string textFiltered) 
    { 
     // Do filtering 
    } 
} 

class Main 
{ 
    protected void Main(object sender, EventArgs e) 
    { 
     InputClass input = new InputClass(); 
     string filtered = new StartFiltering().Filter(input.Description); // at this moment, my input class shouldn't know anything about filters or something. I don't know if it makes any sense but this is what in my mind. 
    } 
} 

Tại thời điểm này, nếu tôi muốn áp dụng Nhà máy trừu tượng cũng vô nghĩa hoặc Trình xây dựng. Bởi vì tôi không muốn một thứ đặc biệt, tôi cần tất cả chúng.

Cảm ơn câu trả lời của bạn bằng cách này.

Chỉnh sửa 2 - Có thể trả lời cho tôi

Okay cho phép suy nghĩ về mô hình chiến lược với giao diện chứ không phải là đại biểu.

interface IFilter //Strategy interface 
{ 
    string Filter(string text); 
} 

class LinkFilter:IFilter //Strategy concrete class 
{ 
    public string Filter(string text) 
    { 
    //filter link tags and return pure text; 
    } 
} 

class PictureFilter:IFilter //Strategy concrete class 
{ 
    public string Filter(string text) 
    { 
    //filter links and return pure text; 
    } 
} 

class Context 
{ 
    private IFilter _filter; 
    private string _text; 
    public Context(IFilter filter,string text) 
    { 
     this._filter = filter; 
     this._text = text; 
    } 

    public void UpdateFilter(IFilter filter) 
    { 
     this._filter = filter; 
    } 

    public string RunFilter() 
    { 

    this._text = _filter.Filter(this._text); 
    return this._text; 
    } 
} 

class MainProgram 
{ 
    static void Main() 
    { 
     MyObject obj = new MyObject(); 
     LinkFilter lfilter = new LinkFilter(); 
     PictureFilter pfilter = new PictureFilter(); 
     Context con = new Context(lfilter,obj.Description); 
     string desc = con.RunFilter(); 
     con.UpdateFilter(pfilter); 
     desc = con.RunFilter(); 
    } 
} 
+0

[Lọc Design Pattern Với Ví dụ] (http://www.singhajit.com/filter-design-pattern/) –

Trả lời

3

Bạn đã xem strategy pattern chưa? Nó cho phép bạn trao đổi các thuật toán.

Nếu đó không phải là những gì bạn đang tìm kiếm, có lẽ decorator pattern sẽ phù hợp hơn. Điều này sẽ cho phép bạn quấn các bộ lọc và áp dụng nhiều bộ lọc nếu cần.

+0

Tôi nghĩ trang trí không phải là điều tôi muốn. Bởi vì bất cứ khi nào tôi cần phải áp dụng bộ lọc mới tôi phải đi và thêm điều này bằng tay vào đối tượng mà tôi muốn trang trí. Tôi cần cách trừu tượng hơn để làm điều đó. – Tarik

+0

Tôi không chắc chắn. Với trang trí, bạn chỉ có thể chồng lên nhau một bộ lọc khác. Vì vậy, khi bạn gọi phương pháp lọc của bộ lọc bên ngoài nhất, anh ta sẽ áp dụng các bộ lọc đóng gói. Điều này sẽ tương tự như lặp qua tất cả các bộ lọc như trong ví dụ của Daren. http://www.dofactory.com/Patterns/PatternDecorator.aspx#_self1 – FrenchData

1

Với tôi, âm thanh này giống như kiểu Strategy.

Có thể là một cái gì đó như thế này (các mã trong VB):

 Function GetFilteredDescription(ByVal iSpecificFilterFunction As AbstractFilterFunction) As Result 
      Return iSpecificFilterFunction.Filter(Me.description) 
     End Function 

Lưu ý: GetFilteredDescription là hàm thành viên của lớp học của bạn.

1

Bạn có thể sử dụng dưới đây mô hình:

  • Chiến lược Pattern với nhiều loại lọc khác nhau
  • Chuỗi Trách nhiệm ngăn xếp bộ lọc của bạn (Bạn có thể thêm lệnh Pattern vào đây để chuỗi khác nhau trong một môi trường đa nhiệm, hoặc bạn có thể triển khai chuỗi dựa trên mức độ ưu tiên hoặc như vậy)
  • Nhà máy xây dựng hoặc Tóm tắt để lọc các tác phẩm tạo mẫu.
8

Tại sao bạn không chỉ đi nhẹ: Xác định bộ lọc của bạn dưới dạng Func<string, string>. Nếu bạn giữ chúng trong một bộ sưu tập (List<Func<string, string>>), bạn chỉ có thể làm:

var text = myObject.DescriptionProperty 
foreach (var func in myFuncList) 
{ 
    text = func(text); 
} 

Bạn cũng có thể sử dụng LINQ để rút ngắn vòng lặp trên:

var text = myFuncList.Aggregate(text, (seed, func) => func(seed)); 

Bằng cách này, bạn không cần phải xác định phân cấp lớp để lọc. Điều này là tốt cho môi trường, vì chúng tôi sẽ chạy ra khỏi lớp học và không gian tên rất sớm!

Để quấn thứ lên, tôi đề nghị bạn Danh sách lớp con:

public class FilterCollection : List<Func<string, string>> 
{ 
    public string Filter(string text) 
    { 
     return this.Aggregate(text, (seed, func) => func(seed)); 
    } 
} 
+0

Thực ra nó được gọi là Chiến lược mẫu tho :) trong C# đại biểu được sử dụng cho mẫu chiến lược nhưng tôi thích ví dụ của bạn. Cảm ơn. – Tarik

+0

Nhưng bạn có một chút khác biệt vì bạn không thay đổi chiến lược bạn chỉ đơn giản là chạy tất cả các đại biểu được áp dụng đó là kinda những gì tôi muốn. – Tarik

+0

Và tôi có nên giữ các phương thức trong Danh sách không? Tôi có thể + = để thêm phương thức khác vào Đại biểu không? – Tarik

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