-
11-02-2008, 09:42 AM #1Junior Member
- 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à ....)
View more random threads:
- Những câu hỏi thường gặp với C# (FAQ C#)
- Mở Tab XtralControl trên user control
- Đổi tên file mà không cần cut hay copy trong lập trình C#
- Viết mã lệnh C# theo chuẩn (Coding Standar)
- RoleProvider MVC3 (Login Phân Quyền)
- Lưu giữ kích thước và vị trí của form trong lập trình C#
- Vlog 6: Hướng dẫn lập trình: Tạo notepad đơn giản với C#
- Tính năng update cho chương trình trong lập trình C#
- Gửi mail với SMTP chứng thực với Gmail
- Gọi hàm export của file .DLL trong lập trình C#
-
11-02-2008, 09:52 AM #2Junior Member
- 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(); }}
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; } }}
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(); } }}
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()); } }}
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]
-
12-02-2008, 01:50 PM #3Junior Member
- 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 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]
-
12-02-2008, 02:57 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi blackpawn
-
12-02-2008, 05:58 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Ô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á
-
12-02-2008, 06:03 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi Z3roXIII
Code trên là OOP , bạn cho biết chỗ nào code rối mắt ?
-
12-02-2008, 06:07 PM #7Junior Member
- 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])
-
12-02-2008, 06:11 PM #8Junior Member
- 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
-
12-02-2008, 07:56 PM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi Z3roXIII
-
14-02-2008, 10:16 AM #10Junior Member
- 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.
Mã:http://rapidshare.com/files/36945347/04dpeoroos199501.rar
Pallet nhựa Long An đã trở thành một trong những lựa chọn phổ biến cho nhu cầu vận chuyển và lưu trữ hàng hóa trong nhiều ngành công nghiệp. Với đặc tính nhẹ nhàng, chắc chắn và dễ vận chuyển, các...
Thanh lý pallet nhựa Long An giá rẻ