BÁO cáo đồ án môn lập TRÌNH HưỚNG đối TưỢNG - Pdf 99

BÁ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ẩm
củ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ập
nà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ả
cá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à

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.
+Thực hiện các hoạt động liên quan đến thành phần con trong
giao diện phần.
Client
+ Điều khiển các đối tượng trong các thành phần thông qua
giao diện phần.
6-SỰ CỘNG TÁC
-Khách hàng sử dụng giao diện lớp Component để tương tác
với các đối tượng trong cơ cấu Composite. Nếu người nhận là một
Leaf, sau đó yêu cầu được xử lý trực tiếp. Nếu người nhận là một
Composite, sau đó nó thường chuyển tiếp yêu cầu các thành phần con
của nó, có thể thực hiện các hoạt động bổ sung trước khi và / hoặc sau
khi chuyển tiếp.
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

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ình
Flyweight (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ùng
không biết về đặc thù các lớp Leaf hay Composite họ đang sử dụng . Để đạt được
mục tiêu này , lớp Component cần xác định nhiều hoạt động phổ biến cho
Composite và Leaf lớp càng tốt. Các Lớp Component thường cung cấp những cài
mặc định cho các hoạt động , và lớp Leaf và Composite lớp con sẽ ghi đè lên
chú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ớp
thiế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ện
mặ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ất
hiện để có ý nghĩa chỉ cho Composites có thể được thực hiện cho tất cả các thành
phầ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 trong
phầ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ụng
mặc định thực hiện, nhưng các lớp Composite sẽ thực thi lại nó để trở về lớp con
củ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ận
trong 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ớp
con, 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ên

//
};
GetComposite lets you query a component to see if it's
a composite. You
can perform Add and Remove safely on the composite it
returns.
Composite* aComposite = new Composite;
Leaf* aLeaf = new Leaf;
Component* aComponent;
Composite* test;
aComponent = aComposite;
if (test = aComponent->GetComposite()) {
test->Add(new Leaf);
}
aComponent = aLeaf;
if (test = aComponent->GetComposite()) {
test->Add(new Leaf); // will not add leaf
}
Kiểm tra tương tự cho một Composite có thể được thực hiện bằng cách sử dụng
cấu trúc C + + dynamic_cast . Tất nhiên, vấn đề ở đây là chúng ta không xử lý với
tấ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ại
khá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 ra
một vấn đề mới: Không có cách nào để thực hiện Component:: Add mà không cần
giớ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 theo
mặc định (có thể bằng nâng cao một ngoại lệ) nếu các thành phần không được

Đ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ện
mộ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ệu
phụ 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ến
cho 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 giao
diệ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
Thiế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ột
khung 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ống
phâ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 Currency DiscountPrice();
virtual void Add(Equipment*);
virtual void Remove(Equipment*);
virtual Iterator* CreateIterator();
protected:
CompositeEquipment(const char*);
private:
List _equipment;
};
Composite Equipment xác định các hoạt động để truy cập và quản lý
subequipment. Các hoạt động Add và Remove bỏ chèn và xóa thiết bị từ danh
sách các thiết bị lưu trữ trong các thành viên _equipment. Các hoạt động
CreateIterator trả về một Iterator (cụ thể, một thể hiện của ListIterator) sẽ đi qua
danh sách này.
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:
Currency CompositeEquipment::NetPrice () {
Iterator* i = CreateIterator();
Currency total = 0;
for (i->First(); !i->IsDone(); i->Next()) {
total += i->CurrentItem()->NetPrice();
}
delete i;
return total;
}
Bây giờ chúng ta có thể đại diện cho một khung máy tính như một lớp con của
CompositeEquipment đã được gọi khung. Khung kế thừa các hoạt động liên quan
đến con từ CompositeEquipment
Class Chassis : public CompositeEquipment {
public:

xác định một cấu trúc Composite cho cây phân tích cú pháp . RegisterTransfer là
lớp Component cho Single Static Assignment (SSA) hình thức của chương trình.
Leaf lớp con của RegisterTransfer xác định các phép gán tĩnh khác nhau như :
-Các phép gán cơ bản mà thực hiện một hoạt động trên hai thanh ghi và gán
kết quả đến một thanh ghi thứ ba ;
-Một phép gán với một thanh ghi nguồn nhưng không có thanh ghi đích,
điều này chỉ ra rằng thanh ghi đã được sử dụng sau khi trả về một đoạn chương
trình và
-Một phép gán với một thanh ghi đích nhưng không có nguồn , điều này chỉ
ra rằng thanh ghi đã được gàn trước khi bắt đầu đoạn chương trình.
Một lớp con khác , RegisterTransferSet , là một lớp Composite đại diện cho phép
gán mà thay đổi một số thanh ghi cùng một lúc.
Một ví dụ khác của mô hình này xảy ra trong lĩnh vực tài chính , nơi một danh mục
đầu tư tập hợp tài sản cá nhân. Bạn có thể hỗ trợ các kết hợp phức tạp của các tài
sản của thực hiện một danh mục đầu tư như là một Composite mà phù hợp với giao
diện của một tài sản cá nhân [ BE93 ] .
Mô hình Command (263) mô tả cách đối tượng Command có thể được sáng tác
và trình tự với một lớp MacroCommand Composite.
CÁC MÔ HÌNH LIÊN QUAN
Thường liên kết thành phần cha mẹ được sử dụng cho một Chain of Responsibility
(251). Decorator (196) thường được sử dụng với Composite. Khi Decorator và
Composite được sử dụng cùng nhau, họ thường sẽ có một lớp cha chung. Vì vậy,
Decorator sẽ phải hỗ trợ giao diện Component với các hoạt động như Add,
Remove, và GetChild. Flyweight (218) cho phép bạn chia sẻ các Component,
nhưng họ có thể không còn tham khảo cha mẹ của họ.
Interater (289) có thể được sử dụng để đi qua Composite.
Visitor (366) chỉ tới 1 hoạt động và hành vi mà nếu không sẽ phân phối trên
Composite và lớp Leaf.
Thật dễ dàng để quên để xóa các Iterator khi bạn đang thực hiện với nó. Iterator
mô hình cho thấy cách bảo vệ chống lại lỗi như vậy trên trang 299.

{
private:

int size;
int top;
T *s_ptr;
public :

Stack(int);

void push(T val);
T pop();
bool IsFull();
bool IsEmty();

};
template <class T>
Stack<T>:: Stack(int maxsize){
size=maxsize;
top=-1;
s_ptr=new T(size);
}
template<class T>
void Stack<T>:: push(T val){
if(!IsFull()){
s_ptr[++top]=val;
}
else
{
cout<<"stack dang day ";

Push : đẩy một phần tử vào stack
Pop: lấy phần tử ra
Isfull: in ra khi stack đầy
IsEmty :in ra khi stack trống
-FILE MAIN.CPP
#include<iostream.h>
#include<conio.h>
#include"Stack.h"
using namespace std;
int main (){
Stack<int> s(5);
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);

for(int i=0 ; i<5; i++){

cout<< s.pop()<< endl;

} return 0;
getche(); KẾT QUẢ CHưƠNG TRÌNH
Khi thay đổi giá trị của biến i
for(int i=0 ; i<6; i++){

cout<< s.pop()<< endl;


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status