Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: DesignPattern | Composite pattern trong lập trình C#

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Talking DesignPattern | Composite pattern trong lập trình C#

    Hình tượng của mẫu composite là một cái cây. Đơn giản vậy thôi Nếu bạn muốn tìm hiểu thêm thì search google với từ khóa "Composite Pattern" (GOF)

    Ở đây nhc lấy ví dụ với đề bài như sau : Tính kích thước (size) của một thư mục (trong thư mục gồm nhiều file và thư mục con, trong thư mục con lại bao gồm nhiều file và thư mục con khác, và ....)

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		compositewj1.jpg
Lần xem:	150
Size:		26.1 KB
ID:		5188
    Keep moving forward!

    ... Retired ...

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Các class và source code tương ứng :

    Item.cs

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace ConsoleApplication2
    6. {
    7.     public abstract class Item
    8.     {
    9.         protected String _Name;
    10.         public String Name
    11.         {
    12.             get { return _Name; }
    13.         }
    14.  
    15.         protected List<Item> _Items;
    16.         public List<Item> Items
    17.         {
    18.             get { return _Items; }
    19.         }
    20.  
    21.         public Item(String name)
    22.         {
    23.             _Name = name;
    24.             _Items = new List<Item>();
    25.         }
    26.  
    27.         public abstract bool HasChild();
    28.         public abstract void AddChild(Item item);
    29.         public abstract int CalcSize();
    30.     }
    31. }


    File.cs

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace ConsoleApplication2
    6. {
    7.     public class File : Item
    8.     {
    9.         private String _Content;
    10.  
    11.         public File(String name, String content)
    12.             : base(name)
    13.         {
    14.             _Content = content;
    15.         }
    16.  
    17.         public override bool HasChild()
    18.         {
    19.             return false;  // files don't have child
    20.         }
    21.  
    22.         public override void AddChild(Item item)
    23.         {
    24.             throw new Exception("File can't contain item.");
    25.         }
    26.  
    27.         public override int CalcSize()
    28.         {
    29.             return _Content.Length;
    30.         }
    31.  
    32.         public override string ToString()
    33.         {
    34.             return "File: " + Name + " - " + _Content;
    35.         }
    36.     }
    37. }


    Folder.cs
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace ConsoleApplication2
    6. {
    7.     public class Folder : Item
    8.     {
    9.         public Folder(String name)
    10.             : base(name)
    11.         {
    12.         }
    13.  
    14.         public override void AddChild(Item item)
    15.         {
    16.             _Items.Add(item);
    17.         }
    18.  
    19.         public override bool HasChild()
    20.         {
    21.             return _Items.Count != 0;
    22.         }
    23.  
    24.         public override int CalcSize()
    25.         {
    26.             int size = 0;
    27.          
    28.             foreach (Item item in _Items)
    29.             {
    30.                 size += item.CalcSize();
    31.             }
    32.  
    33.             return size;
    34.         }
    35.  
    36.         public override String ToString()
    37.         {
    38.             StringBuilder builder = new StringBuilder();
    39.  
    40.             builder.AppendLine("Folder: " + Name);
    41.             foreach (Item item in _Items)
    42.             {
    43.                 builder.AppendLine("++ " + item.ToString());
    44.             }
    45.  
    46.             return builder.ToString();
    47.         }
    48.     }
    49. }

    Program.cs

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4. using System.Windows.Forms;
    5.  
    6. namespace ConsoleApplication2
    7. {
    8.     class Program
    9.     {
    10.         static void Main(string[] args)
    11.         {
    12.             Folder diskc = new Folder("DiskC");
    13.             Folder win32 = new Folder("Win32");
    14.  
    15.             Folder resources = new Folder("Resources");
    16.             File xpTheme = new File("XPTheme", "This is the XP Theme");
    17.             File icon = new File("Icon", "This is a icon");
    18.             resources.AddChild(xpTheme);
    19.             resources.AddChild(icon);
    20.  
    21.             Folder driver = new Folder("Driver");
    22.             File intel = new File("Intel", "This is Intel driver");
    23.             File asus = new File("Asus", "This is Asus driver");
    24.             driver.AddChild(intel);
    25.             driver.AddChild(asus);
    26.  
    27.             win32.AddChild(resources);
    28.             win32.AddChild(driver);
    29.  
    30.             diskc.AddChild(win32);
    31.  
    32.             Console.WriteLine(diskc.ToString());
    33.             Console.WriteLine("Total size = " + diskc.CalcSize());
    34.         }
    35.     }
    36. }

    P/s: nhc cũng mới học thôi, các cao thủ về Design Pattern thấy có gì ko hợp lý trong cách cài đặt (cũng như ý tưởng) cứ lên tiếng nhé. Chân thành cám ơn mọi đóng góp

    Regards

    Mới xem kĩ lại, thấy cái _Items để ở class Item hơi thừa, nhưng ko ảnh hưởng lắm đến hòa bình thế giới
    Keep moving forward!

    ... Retired ...

  3. #3
    Ngày gia nhập
    05 2007
    Nơi ở
    UNS
    Bài viết
    9

    Ông có thể đưa ý tưởng và ứng dụng của cái này đc ko vậy, đc dùng trong trường hợp nào và có ích lợi gì hơn cách thông thường đc ko vậy, đọc code rối mắt quá

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi Z3roXIII Xem bài viết
    Ông có thể đưa ý tưởng và ứng dụng của cái này đc ko vậy, đc dùng trong trường hợp nào và có ích lợi gì hơn cách thông thường đc ko vậy, đọc code rối mắt quá
    Bạn cho biết thế nào là cách thông thường ?
    Code trên là OOP , bạn cho biết chỗ nào code rối mắt ?
    None!

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Nói ra thì rất khó, phải chịu khó đọc bản Tiếng Anh cuốn Design Pattern của Gang Of Four (GAM95) thì sẽ thông suốt hơn.

    Nói chung mẫu Composite này rất lợi hại, nó chuyên trị những bài có dạng đệ qui, nó làm việc trên các đối tượng abstract, ko làm việc với đối tượng cụ thể nên khả năng mở rộng cũng rất cao.

    Hình tượng của mẫu Composite là một cái cây

    Một ví dụ kinh điển của mẫu Composite là bài mạch điện . Một mạch điện gồm nhiều mạch đơn và mạch phức, mạch phức lại có thể gồm nhiều mạch đơn hoặc mạch phức khác và cứ thế (đệ qui)

    Việc học Design Pattern ko thể học suông được mà phải áp dụng được vào bài toán được đưa ra (biết áp dụng thực tế )
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 12-02-2008 lúc 11:09 AM.
    Keep moving forward!

    ... Retired ...

  6. #6
    Ngày gia nhập
    05 2007
    Nơi ở
    UNS
    Bài viết
    9

    Mặc định DesignPattern | Composite pattern trong lập trình C#

    Nói đến cái bài mạch điện là nhớ đến cái bài OOP hồi xưa :-?. Chắc là phải đọc thêm sách thôi, đọc code thì hiểu đó nhưng chỉ sợ là không hiểu đúng đc ý tưởng của thuật toán

  7. #7
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Trích dẫn Nguyên bản được gửi bởi Z3roXIII Xem bài viết
    Nói đến cái bài mạch điện là nhớ đến cái bài OOP hồi xưa :-?. Chắc là phải đọc thêm sách thôi, đọc code thì hiểu đó nhưng chỉ sợ là không hiểu đúng đc ý tưởng của thuật toán
    Cái này liên quan gì nhiều đến thuật toán đâu, chỉ là các mẫu pattern nếu được ứng dụng phù hợp vào thực tế để tạo nên framework cụ thế thôi. Học OOP và thiết kế ứng dụng OOP sau này ứng dụng nó khá nhiều đó.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  8. #8
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Composite là một trong những pattern đơn giản nhất trong những pattern.
    Chẳng có nhiều điều để nói

    Quan trọng nhất là cậu phải biết được ưu nhược của nó, khi nào cần hay không được dùng nó,

    Pattern mà tôi thích đề cập nhất có lẽ là adapter, tại sao ấn tượng? Vì tôi hỏi ai "Khi nào dùng" thì chả ai trả lời đủ cả, cả những người 3-4 năm kinh nghiệm.

    Các cậu mới là sinh viên đã cất công tìm hiểu nó thì rất đáng khâm phục, thử trả lời câu trên xem, đó là câu ưa thích của nhiều người tuyển dụng

    Nếu các cậu đọc cuốn "Gang of Four Design Patterns" sẽ thấy rất hay, về kỹ thuật thì khỏi phải nói, đủ cả, tuy nhiên phần mạn bàn của nó "when and where use it" thì chỉ sơ sài thôi, các cậu cần làm nhiều hơn nữa thì mới hiểu rõ được

    PS: Nói cái nữa là các cậu chả cần biết gì về Design Patterns thì vẫn làm việc rất tốt, thực ra có khi mình dùng mà mình cũng chẳng biết, người nào cần design class diagram thì mới rất cần biết
    Đã được chỉnh sửa lần cuối bởi nguyentuan2 : 12-02-2008 lúc 01:14 PM.

  9. #9
    Ngày gia nhập
    12 2007
    Bài viết
    28

    Nói ra thì rất khó, phải chịu khó đọc bản Tiếng Anh cuốn Design Pattern của Gang Of Four (GAM95) thì sẽ thông suốt hơn.
    Theo em biết thì Design Patterns đã có bản dịch tiếng Việt, chắc dùng cũng tạm được.

    Theo cuốn sách mà em có thì mẫu Composite được dùng khi: (copy & paste 100%)
    - Muốn thể hiện toàn bộ cấu trúc phân cấp của các đối tượng
    - Muốn người dùng giao tiếp với các loại đối tượng khác nhau(phức hợp & đơn lẻ) theo một cách giống nhau.

    Em thấy cũng đúng!

    Nhược điểm của mẫu này là "làm cho thiết kế quá chung chung". "Một bất lợi của việc thêm những Component (Item) mới dễ dàng là nó làm cho việc giới hạn các thành phần của Composite (Folder) khó hơn. Đôi khi bạn muốn một Composite chỉ có một vài component nào đó, nhưng với Composite bạn không thể dựa trên hệ thống phân loại để áp dụng những giới hạn này theo cách riêng của bạn. Thay vào đó phải kiểm tra trong lúc chạy chương trình"
    ... Nói thật đoạn vừa rồi em cũng chưa hiểu lắm, nếu có ai rành xin chỉ giúp.

  10. #10
    Ngày gia nhập
    06 2007
    Nơi ở
    TP.HCM
    Bài viết
    113

    Trích dẫn Nguyên bản được gửi bởi blackpawn Xem bài viết
    Theo em biết thì Design Patterns đã có bản dịch tiếng Việt, chắc dùng cũng tạm được.
    Share dùm cả 2 cuốn tiếng anh lẫn tiếng việt đi bạn! Thanks! Thanks!

    Gác Kiếm

Các đề tài tương tự

  1. Chương 8: Mẫu Iterator và Composite - Series bài dịch Design Pattern for Dummies
    Gửi bởi ali33C trong diễn đàn Tutorials và Thủ thuật lập trình Java
    Trả lời: 6
    Bài viết cuối: 02-05-2017, 10:14 PM
  2. DesignPattern | Abstract Factory trong lập trình C#
    Gửi bởi ZCoder87 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 7
    Bài viết cuối: 22-03-2013, 03:16 PM
  3. Tính kích thước 1 thư mục cho trước (dùng Design pattern Composite)
    Gửi bởi y5k72pk trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 2
    Bài viết cuối: 19-11-2011, 02:05 AM
  4. Observer pattern trong lập trình C#
    Gửi bởi laptrinhc97 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 10-12-2010, 10:33 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn