Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 11
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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 [IMG]images/smilies/biggrin.png[/IMG] 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à ....)


  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Các class và source code tương ứng :

    Item.cs


    Mã:
    using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication2{    public abstract class Item    {        protected String _Name;        public String Name        {            get { return _Name; }        }         protected List<Item> _Items;        public List<Item> Items        {            get { return _Items; }        }         public Item(String name)        {            _Name = name;            _Items = new List<Item>();        }         public abstract bool HasChild();        public abstract void AddChild(Item item);        public abstract int CalcSize();    }}
    File.cs


    Mã:
    using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication2{    public class File : Item    {        private String _Content;         public File(String name, String content)             : base(name)        {            _Content = content;        }         public override bool HasChild()        {            return false;  // files don't have child        }         public override void AddChild(Item item)        {            throw new Exception("File can't contain item.");        }         public override int CalcSize()        {            return _Content.Length;        }         public override string ToString()        {            return "File: " + Name + " - " + _Content;        }    }}
    Folder.cs

    Mã:
    using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication2{    public class Folder : Item    {        public Folder(String name)             : base(name)        {        }         public override void AddChild(Item item)        {            _Items.Add(item);        }         public override bool HasChild()        {            return _Items.Count != 0;        }         public override int CalcSize()        {            int size = 0;                     foreach (Item item in _Items)            {                size += item.CalcSize();            }             return size;        }         public override String ToString()        {            StringBuilder builder = new StringBuilder();             builder.AppendLine("Folder: " + Name);            foreach (Item item in _Items)            {                builder.AppendLine("++ " + item.ToString());            }             return builder.ToString();        }    }}
    Program.cs


    Mã:
    using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms; namespace ConsoleApplication2{    class Program    {        static void Main(string[] args)        {            Folder diskc = new Folder("DiskC");            Folder win32 = new Folder("Win32");             Folder resources = new Folder("Resources");            File xpTheme = new File("XPTheme", "This is the XP Theme");            File icon = new File("Icon", "This is a icon");            resources.AddChild(xpTheme);            resources.AddChild(icon);             Folder driver = new Folder("Driver");            File intel = new File("Intel", "This is Intel driver");            File asus = new File("Asus", "This is Asus driver");            driver.AddChild(intel);            driver.AddChild(asus);             win32.AddChild(resources);            win32.AddChild(driver);             diskc.AddChild(win32);             Console.WriteLine(diskc.ToString());            Console.WriteLine("Total size = " + diskc.CalcSize());        }    }}
    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 [IMG]images/smilies/biggrin.png[/IMG]

    Regards [IMG]images/smilies/biggrin.png[/IMG]

    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 [IMG]images/smilies/biggrin.png[/IMG]

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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![IMG]images/smilies/biggrin.png[/IMG]

    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.[IMG]images/smilies/online.gif[/IMG]

  4. #4
    Trích dẫn Gửi bởi blackpawn
    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!

  5. #5
    Ô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á

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Z3roXIII
    Ô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 ?

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 [IMG]images/smilies/biggrin.png[/IMG]. 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ế [IMG]images/smilies/biggrin.png[/IMG])

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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

  9. #9
    Trích dẫn Gửi bởi Z3roXIII
    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 đó.

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Kiếm được cuốn Tiếng Anh nè, ai thích thì down nhé [IMG]images/smilies/wink.png[/IMG]


    Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series)
    ISBN: 0201633612
    Author: Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides
    Publisher: Addison-Wesley Professional
    Edition: 1st edition (January 15, 1995) Language: English
    Hardcover: 395 pages
    URL: /http://www.amazon.com/exec/obidos/redirect?tag=songstech-20&path=ASIN%2F0201633612
    Summary:
    Design Patterns is a modern classic in the literature of object-oriented development, offering timeless and elegant solutions to common problems in software design. It describes patterns for managing object creation, composing objects into larger structures, and coordinating control flow between objects. The book provides numerous examples where using composition rather than inheritance can improve the reusability and flexibility of code. Note, though, that it's not a tutorial but a catalog that you can use to find an object-oriented design pattern that's appropriate for the needs of your particular application--a selection for virtuoso programmers who appreciate (or require) consistent, well-engineered object-oriented designs.
    Download here:
    Mã:
    http://rapidshare.com/files/36945347/04dpeoroos199501.rar
    Còn cuốn TV thì chịu khó ra nhà sách kiếm, của Minh Khai thì phải, nhưng mà nó dịch bưởi lắm

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •