đề tài xây dựng template cho stack
Trang 1BÁO CÁO ĐỒ ÁN MÔN LẬP TRÌNH HƯỚNG ĐỐI
TƯỢNG
ĐỀ TÀI : XÂY DỰNG TEMPLATE CHO STACK
LÝ THUYẾT:TÌM HIỂU COMPOSITE
A- TÌM HIỂU COMPOSITE
1 MỤC ĐÍCH
- Soạn các đối tượng vào cơ cấu cây để đại diện cho một phần – toàn bộ hệ thống Compsite cho phép khách hàng xử lý đối tượng cá nhân và tác phẩmcủa các đối tượng thống nhất
Tóm lại Composite là một tập hợp các đối tượng ,bất kỳ đối tượng nào trong tậpnày đều có thể đóng vai trò đa hợp (Composite –chứa các đối tượng cùng loại), hoặc chỉ là các đối tượng cơ bản (primitive object- không thể chứa đối tượng
cùng loại khác.Một đối tượng composite được tạo thành từ một hay nhiều đối
tượng tương tự nhau (hoặc có một số chức năng tương tự nhau) Ý tưởng ở đây
là có thể thao tác trên một nhóm đối tượng theo cách như thao tác trên một đối tượng duy nhất Các đối tượng của nhóm phải có các thao tác chung, hay còn gọi là mẫu số chung nhỏ nhất
2 ĐỘNG LỰC
Các ứng dụng đồ họa như biên tập bản vẽ và hệ thống chụp giản đồ cho phép người dùng xây dựng sơ đồ phức tạp của các thành phần đơn giản Người sử dụng có thể nhóm các thành phần để tạo thành phần lớn hơn, do
đó có thể được nhóm lại để hình thành nên các thành phần lớn hơn Một hành động đơn giản có thể định nghĩa cho lớp đồ họa cơ bản chẳng hạn như Text và Line cộng với các lớp khác mà hoạt động như bao hàm cho các cơ bản đó Nhưng có một vấn đề với cách tiếp cận này: Mã số sử dụng các lớp này phải xử lý đối tượng cơ bản và bao hàm khác nhau, ngay cả khi hầu hết thời gian người sử dụng xử lý chúng giống nhau Phải phân biệt các đối tượng này làm cho các ứng dụng phức tạp hơn Mô hình Composite mô tả
Trang 2cách sử dụng thành phần đệ quy để khách hàng không cần phải làm cho sự khác biệt này
Chìa khóa để mô hình Composite là một lớp trừu tượng đại diện cho cả cơ bản và
sự bao hàm của chúng Đối với hệ thống đồ họa, lớp này là Graphic Graphic thiết lập hoạt động như Draw được cụ thể cho các đối tượng đồ họa
Nó cũng thiết lập hoạt động mà tất cả đối tượng Composite chia sẻ, giống như hoạtđộng truy cập và quản lý con của nó.Các con Line, Rectangle , và Text (xem trước sơ đồ lớp ) xác định đối tượng đồ họa cơ bản Các lớp thực hiện: Draw để vẽ đường ,hình chữ nhật, và văn bản , tương ứng Từ đồ họa cơ bản không có con đồ họa, không có những lớp con thực thi các hoạt động liên quan đến con
Lớp Picture định nghĩa một tập hợp của các đối tượng Graphic Picture thực thi Draw gọi Draw trên con của nó, và nó thực hiện các hoạt động liên quan đến lớp con cho phù hợp Bởi vì giao diện Picture phù hợp với giao diện Graphic ,Đối tượng Picture có thể sinh ra Picture đệ quy khác.Sơ đồ dưới đây cho thấy một cấu trúc đối tượng Composite điển hình của đệ quy đối tượng Graphic :
Trang 33-KHẢ NĂNG ỨNG DỤNG
-Sử dụng mô hình Composite khi :
+ Bạn muốn đại diện cho bộ phận- toàn thể đối tượng +Bạn muốn khách hàng có thể bỏ qua sự khác biệt giữa các đối tượng tổng quát và các đối tượng cá nhân Khách hàng sẽ xử lý tất cả các đối tượngtrong cấu trúc tổng hợp thống nhất
4-CẤU TRÚC
Một cấu trúc đối tượng tổng hợp điển hình có thể như sau:
Trang 45-NGƯỜI THAM DỰ
-Thành phần
Component (Graphic)
+Thiết lập giao diện cho các đối tượng trong thành phần
+ Thực hiện cách xử lý mặc định cho giao diện chung cho tất cảcác lớp cho phù hợp
+Thiết lập một giao diện để truy cập và quản lý các thành phần con của nó
+(tùy chọn) xác lập một giao diện để truy cập đến bố mẹ của một thành phần trong cấu trúc đệ quy, và thực hiện nó nếu đó là phù hợp
Leaf (Rectangle, Line, Text, vv)
+Đại diện cho đối tượng lá trong thành phần Một lá không có con
+Xác định cách xử lý cho các đối tượng cơ bản trong thành phần
Composite (Picture)
+ Xác định hành vi cho các thành phần có con
+Lưu trữ thành phần con
Trang 5+Thực hiện các hoạt động liên quan đến thành phần con trong giao diện phần
7-HỆ QUẢ
Mô hình Composite
+Xác định phân cấp lớp bao gồm các đối tượng cơ bản và các đối tượng
composite Đối tượng cơ bản có thể được gộp lại tạo thành nhiều đối tượng phức tạp, lần lượt có thể được gộp lại, và như vậy đệ quy Bất cứ nơi nào mã số khách hàng mong đợi một đối tượng cơ bản, nó cũng có thể có một đối tượng Composite.+Làm các khách hàng đơn giản Khách hàng có thể xử lý và cấu trúc lại
Composite thống nhất đối tượng cá nhân Khách hàng thường không biết (và
không nên quan tâm) cho dù họ đang đối phó với một Leaf hoặc một thành phần Composite Điều này đơn giản hoá mã khách hàng, bởi vì nó tránh phải viết chức năng tag-and-case-statement-style qua các lớp mà xác định thành phần
+ Làm cho nó dễ dàng hơn để thêm các loại mới của các thành phần Vừa đượcđịnh nghĩa Composite hoặc lớp con Leaf làm việc tự động với cấu trúc hiện tại và
mã khách hàng Khách hàng không cần phải thay đổi cho các lớp Component mới.+Có thể làm cho thiết kế của bạn quá chung chung Những bất lợi làm cho nó dễdàng để thêm các thành phần mới điều đó làm cho nó khó khăn hơn để hạn chế cácthành phần của một Composite Đôi khi bạn muốn có một Composite chỉ có một số
Trang 6các thành phần Với Composite, bạn không thể dựa vào loại hệ thống để thực thinhững khó khăn cho bạn Bạn sẽ phải sử dụng kiểm tra thời gian chạy thay vì điềuđó.
8-THỰC HIỆN
Có nhiều vấn đề cần xem xét khi thực hiện mẫu Composite:
1-Tài liệu tham khảo rõ ràng:
Duy trì tài liệu tham khảo từ các thành phần con đến thành phần cha mẹ của chúng
có thể đơn giản hóa sự giao nhau và quản lý của một cấu trúc Composite Tài liệutham khảo cha mẹ đơn giản hoá việc di chuyển lên cấu trúc và xóa một phần Tàiliệu tham khảo cha mẹ cũng giúp hỗ trợ là mô hình Chain of Responsibility (251)
Vị trí thông thường để xác định tài liệu tham khảo cha mẹ là trong lớp Component.Leaf và Composite những lớp có thể kế thừa tài liệu tham khảo và các hoạt động
mà quản lý nó Với tài liệu tham khảo cha mẹ, nó là điều cần thiết để duy trì bấtbiến mà tất cả Các con của một hỗn hợp có giống như cha mẹ của chúng hỗn hợplần lượt có chúng như trẻ em Cách dễ nhất để đảm bảo điều này là để thay đổi mộtthành phần mẹ của chỉ khi nó được thêm vào hoặc gỡ bỏ từ một hỗn hợp Nếu điềunày có thể được thực hiện một lần trong Add và Remove hoạt động của Tổng hợplớp, sau đó nó có thể được thừa hưởng tất cả các lớp con, và bất biến sẽ được duytrì tự động
2 Chia sẻ các thành phần
Nó thường hữu ích để chia sẻ các thành phần, ví dụ, để giảm các yêu cầu lưu trữ.Nhưng khi một thành phần có thể có không quá một bố mẹ, các thành phần chia sẻtrở nên khó khăn Một giải pháp có thể là cho con lưu trữ nhiều cha mẹ Nhưngđiều đó có thể dẫn đến sự mơ hồ như một yêu cầu truyền lên cấu trúc Các mô hìnhFlyweight (218) cho thấy cách làm lại một thiết kế để tránh các bậc cha mẹ lưu trữhoàn toàn Nó hoạt động trong trường hợp con có thể tránh việc gửi yêu cầu bố mẹcủa một số bên ngoài hoặc tất cả các vị trí của họ
3 Tối đa hóa giao diện phần
Một trong những mục tiêu của mô hình Composite là để làm cho người dùngkhông biết về đặc thù các lớp Leaf hay Composite họ đang sử dụng Để đạt được
Trang 7mục tiêu này , lớp Component cần xác định nhiều hoạt động phổ biến choComposite và Leaf lớp càng tốt Các Lớp Component thường cung cấp những càimặc định cho các hoạt động , và lớp Leaf và Composite lớp con sẽ ghi đè lênchúng Tuy nhiên , mục tiêu này sẽ đôi khi mâu thuẫn với các nguyên tắc của lớpthiết kế hệ thống cấp bậc mà nói một lớp chỉ cần xác định các hoạt động có có ýnghĩa cho lớp con của nó Có rất nhiều hoạt động mà phần hỗ trợ mà dường nhưkhông có ý nghĩa cho các lớp lá Làm thế nào có thể phần cung cấp một thực hiệnmặc định cho chúng?Đôi khi một chút sáng tạo cho thấy một hoạt động mà sẽ xuấthiện để có ý nghĩa chỉ cho Composites có thể được thực hiện cho tất cả các thànhphần của di chuyển nó vào lớp Component Ví dụ, giao diện để truy cập lớp con làmột phần cơ bản của một lớp hỗn hợp nhưng không nhất thiết phải Lớp Leaf Nhưng nếu chúng ta xem một Leaf là một thành phần mà không bao giờ cócon ,sau đó chúng ta có thể xác định một hoạt động mặc định để truy cập con trongphần lớp mà không bao giờ trả về bất kỳ lớp con Các Lớp Leaf có thể sử dụngmặc định thực hiện, nhưng các lớp Composite sẽ thực thi lại nó để trở về lớp concủa chúng.Các hoạt động quản lý lớp con có nhiều phiền hà và được thảo luậntrong mục tiếp theo
4 Thiết lập các hoạt động quản lý lớp con
Mặc dù lớp Composite thực hiện các hoạt động Add và Remove để quản lý lớpcon, quan trọng vấn đề trong mô hình hỗn hợp là có các lớp học tuyên bố các hoạtđộng này trong hệ thống phân cấp lớp Composite Chúng ta nên khai báo các hoạtđộng trong Hợp phần và làm cho họ có ý nghĩa cho các lớp lá , hoặc chúng ta nênkhai báo và xác định họ chỉ trong Composite và lớp con của nó ? Quyết định liênquan đến một thoả hiệp giữa an toàn và minh bạch :
Xác định giao diện quản lý lớp con ở thư mục gốc của lớp hệ thống phân cấp cho bạn tính minh bạch , bởi vì bạn có thể xử lý tất cả thành phần thống nhất Nó chi phí bạn an toàn , tuy nhiên , bởi vì khách hàng có thể cố gắng làm những việc vô nghĩa như thêm và loại bỏ các đối tượng từ Leaf
Xác định quản lý lớp con trong lớp Composite mang lại cho bạn an toàn , bởi vì bất kỳ nỗ lực để thêm hoặc loại bỏ các đối tượng từ lá sẽ bị bắt tại thời gian biên dịch bằng một ngôn ngữ kiểu tĩnh như C + + nhưng bạn bị mất tính minh bạch , bởi vì Leaf và Composite có khác nhau giao diện
Trang 8Chúng tôi đã nhấn mạnh tính minh bạch về an toàn trong mô hình này Nếu bạn lựachọn cho an toàn , sau đó vào những thời điểm bạn có thể mất các loại thông tin vàphải chuyển đổi một thành phần thành một hỗn hợp Làm thế nào bạn có thể làmđiều này mà không cần đến một nhập - không an toàn diễn viên ? Một cách tiếpcận là để khai báo một hoạt động Composite * GetComposite () trong Lớp thànhphần Thành phần cung cấp một hoạt động mặc định trả về một null con trỏ LớpSomposite định nghĩa lại hoạt động này để trở về bản thân thông qua con trỏ này:class Composite;
Composite* aComposite = new Composite;
Leaf* aLeaf = new Leaf;
Trang 9Kiểm tra tương tự cho một Composite có thể được thực hiện bằng cách sử dụngcấu trúc C + + dynamic_cast Tất nhiên, vấn đề ở đây là chúng ta không xử lý vớitất cả các thành phần thống nhất Chúng ta phải trở lại thử nghiệm với nhiều loạikhác nhau trước khi lấy hành động thích hợp Cách duy nhất để cung cấp chính xác
là xác định mặc định Add và Remove hoạt động trong Component Điều đó tạo ramột vấn đề mới: Không có cách nào để thực hiện Component:: Add mà không cầngiới thiệu các khả năng của nó Bạn có thể làm cho nó không làm gì cả, nhưng mà
bỏ qua một yếu tố quan trọng; có nghĩa là, một nỗ lực để thêm một cái gì đó đểmột Leaf có thể chỉ ra một lỗi Trong trường hợp đó, Add hoạt động sản xuất dữliệu hỏng Bạn có thể làm cho nó xóa đối số của nó, nhưng đó không thể là những
gì Client mong đợi Thường nó tốt hơn để làm cho Add và Remove không theomặc định (có thể bằng nâng cao một ngoại lệ) nếu các thành phần không đượcphép có con hoặc nếu đối số của Remove không phải là con của các thành phầntương ứng Một lựa chọn khác là thay đổi ý nghĩa của "loại bỏ" một chút nếuthành phần duy trì một tài liệu tham khảo cha mẹ, sau đó chúng ta có thể xác địnhlại Component :: Remove bỏ để loại bỏ chính nó từ cha của nó Tuy nhiên, vẫncòn không phải là một giải thích ý nghĩa cho một Add tương ứng
5 có nên thực thi Component một danh sách các Component?
Bạn có thể bị cám dỗ để xác định các thiết lập của con như một biến trong lớpComponent nơi hoạt động truy cập và quản lý lớp con được khai báo Nhưng đặtcon trỏ con trong lớp cơ sở phải gánh chịu một điều khoản không gian cho mỗiLeaf, mặc dù một Leaf không có con Điều này là đáng giá nếu có rất ít con trongcấu trúc
6 Sắp thứ tự con
Nhiều thiết kế chỉ định một trật tự trên các con
Composite Trong ví dụ Graphic trước đó, việc sắp thứ tự có thể phản ánh
trước đến sau việc sắp xếp thứ tự Nếu Composites đại diện cho cây phân tích cúpháp, sau đó câu lệnh phức có thể là phiên bản của một Composite cái mà conphải được lệnh để phản ánh chương trình
Trang 10Khi việc sắp xếp là một vấn đề, bạn phải thiết kế truy cập và quản lý giaodiện con một cách cẩn thận để quản lý các trình tự của con Mô hình Iterator (289)
có thể hướng dẫn bạn trong việc này
7-Bộ nhớ đệm để cải thiện hiệu suất.
Nếu bạn cần phải truy cập hoặc tìm kiếm composition(sự hợp thành) thườngxuyên, lớp composite có thể truy cập bộ nhớ tạm hoặc tìm kiếm thông tin về concủa nó Composite có thể lưu lại kết quả thực tế hoặc chỉ thông tin cho phép nó rútngắn quá trình truy cập hoặc tìm kiếm
Ví dụ:
Lớp Picture từ ví dụ Motivation có thể lưu trữ tạm hộp con ranh giới của nó Trongbản vẽ hoặc lựa chọn, lưu trữ này cho phép các hình vẽ tránh hoặc tìm kiếm khicon của nó không hiển thị trong cửa sổ hiện hành
Thay đổi cho một Component sẽ yêu cầu hủy bỏ hiệu lực các cache của cha mẹ nó.Điều này làm việc tốt nhất khi các thành phần biết cha mẹ của nó Vì vậy, nếu bạnđang sử dụng bộ nhớ đệm, bạn cần phải xác định một giao diện cho Composite cái
mà cache bị vô hiệu
8 Ai nên xóa các component?
Trong ngôn ngữ mà không thu gom rác thải, đó là thường là tốt nhất để thực hiệnmột nhiệm vụ Composite cho việc xóa con của nó khi nó bị tiêu diệt Một ngoại lệcho quy tắc này là khi đối tượng lá Leaf bất biến và do đó có thể đã được chia sẻ
9 Cấu trúc dữ liệu tốt nhất để lưu trữ các thành phần là gì?
Composite có thể sử dụng một loạt các cấu trúc dữ liệu để lưu trữ con của chúng,bao gồm danh sách liên kết, cây, mảng, và các bảng việc lựa chọn cấu trúc dữ liệuphụ thuộc (như luôn luôn) tính hiệu quả Trong thực tế, nó không cần thiết để sửdụng một mục đích chung cấu trúc dữ liệu ở tất cả Đôi khi Composite có một biếncho mỗi con, mặc dù điều này đòi hỏi mỗi lớp con của Composite hực hiện giaodiện quản lý của riêng mình Xem Interpreter (274) cho một ví dụ về điều này
SAMPLE CODE
Trang 11Thiết bị như máy tính và các thành phần âm thanh stereo thường được tổ chức nhưpart-whole (bộ phận- toàn thể) hoặc ngăn chặn hệ thống phân cấp Ví dụ, mộtkhung xe có thể chứa ổ đĩa và bảng phẳng, một chiếc xe buýt có thể chứa thẻ, vàmột nội các có thể chứa khung gầm, xe buýt, và vv Cấu trúc như vậy có thể được
mô hình tự nhiên với Composite mô hình
Lớp Equipment định nghĩa một giao diện cho tất cả các thiết bị trong hệ thốngphân cấp part-whole
class Equipment {
public:
virtual ~Equipment();
const char* Name() { return _name; }
virtual Watt Power();
virtual Currency NetPrice();
virtual Currency DiscountPrice();
virtual void Add(Equipment*);
virtual void Remove(Equipment*);
virtual Iterator* CreateIterator();
Lớp con của Equipment có thể bao gồm các lớp lá đại diện cho ổ đĩa, mạch tíchhợp, và chuyển mạch:
class FloppyDisk : public Equipment {
Trang 12virtual Currency NetPrice();
virtual Currency DiscountPrice();
};
CompositeEquipment is the base class for equipment that contains other
equipment
It's also a subclass of Equipment
class CompositeEquipment : public Equipment {
public:
virtual ~CompositeEquipment();
virtual Watt Power();
virtual Currency NetPrice();
virtual Currency DiscountPrice();
virtual void Add(Equipment*);
virtual void Remove(Equipment*);
virtual Iterator* CreateIterator();
Một thực hiện mặc định của NetPrice có thể sử dụng CreateIterator tổng giá net của subequipment2: