Phân tích và thiết kế hướng đối tượng dùng UML

Mục tiêu: ₫ịnh nghĩa sựphụthuộc 1-n giữa các ối tượng sao cho khi 1 ₫ối tượng thay ₫ổi trạng thái thì các ₫ội tượng phụthuộc ₫ược cảnh báo hầu hiệu chỉnh tự ₫ộng (₫ể ₫ảm bảo tính nhất quán). ‰Nhu cầu áp dụng: trong ứng dụng quản lý bảng tính, mỗi bảng tính là 1 database nhưng nó ₫ược trình bày dưới nhiều dạng khác nhau như spreadsheet, barchart, piechart,. Mỗi khi nội dung database thay ₫ổi ta muốn cập nhật ₫ồng thời nhiều dạng biểu diễn nó. →hướng giải quyết vấn ₫ềcủa mẫu Observer.

pdf176 trang | Chia sẻ: aloso | Lượt xem: 2272 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Phân tích và thiết kế hướng đối tượng dùng UML, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
); virtual void Enter(); Room* OtherSideFrom (Room*); private: Room* m_room1, m_room2; bool m_isOpen; }; Ví dụ về quá trình khởi tạo ₫ối tượng Chương 11 : Các mẫu Creational 135 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 269 ‰ Lớp Maze có thể hiện thực trong C++ như sau : class Maze { public: Maze(); void AddRoom(Room*); Room* RoomNo(int) const; private: //… }; ‰ Lớp MazeGame tích hợp những lớp ₫ã giới thiệu ₫ể tạo thành một game có sử dụng mê lộ. Lớp này phải tạo ra một mê lộ (Maze), method CreateMaze tạo một mê lộ ₫ơn giản gồm 2 phòng có thể ₫ược ₫ịnh nghĩa trong C++ như sau : Ví dụ về quá trình khởi tạo ₫ối tượng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 270 Maze* MazeGame::CreateMaze() { Maze* aMaze=new Maze; Room* r1=new Room(1); Room* r2=new Room(2); Door* theDoor = new Door(r1,r2); aMaze->AddRoom(r1) aMaze->AddRoom(r2) r1->setSide(North, new Wall); … r2->setSide(North, new Wall); … return aMaze; } ‰ Phương thức CreateMaze bị ràng buộc cứng (Hard code), ₫iều này dẫn ₫ến hai nhược ₫iểm : - Không thể sinh ra một maze có cấu trúc khác (VD: các phần tử ở các hướng của các room thay ₫ổi). - Rất khó tái sử dụng phương thức này ₫ể tạo ra một maze có ₫ặc ₫iểm khác (VD: maze trong ₫ó các phòng có thể có bom hoặc quà tặng, cửa giữa các phòng chỉ có thể mở bằng câu thần chú…) vì CreateMaze ₫ã ràng buộc cứng các tên lớp. Ví dụ về quá trình khởi tạo ₫ối tượng Chương 11 : Các mẫu Creational 136 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 271 ‰ Truyền cho phương thức CreateMaze một ₫ối tượng có khả năng sinh ra room, wall, door theo ₫ặc thù của ứng dụng. Khi ₫ó nếu muốn thay ₫ổi maze thì chỉ cần truyền một ₫ối tượng khác. Đây là hướng tiếp cận của mẫu Abstract Factory. ‰ Code trong CreateMaze gọi các phương thức thông thường (hoặc virtual) ₫ể khởi tạo ₫ối tượng thay vì gọi constructor của lớp tương ứng. Khi ₫ó nếu muốn thay ₫ổi lớp sẽ tạo ₫ối tượng thì chỉ cần tạo một subclass thừa kế MazeGame, trong ₫ó override các phương thức khởi tạo ₫ối tượng ở trên. Đây là hướng tiếp cận của mẫu Factory Method. ‰ CreateMaze ₫ược truyền các ₫ối tượng room, door, wall có khả năng sinh ra ₫ối tượng tương tự chúng (clone). Khi ₫ó nếu muốn thay ₫ổi ₫ối tượng trong CreateMaze, ta chỉ cần truyền vào các ₫ối tượng khác. Các ₫ối tượng truyền cho CreateMaze gọi là Prototype và hướng tiếp cận này là của mẫu Prototype. ‰ CreateMaze ₫ược truyền 1 ₫ối tượng mà có thể tạo mêlộ mới dùng các tác vụ thêm phòng, cửa và tường vào mêlộ mà nó xây dựng rồi ta dùng thừa kế ₫ể thay ₫ổi các phần của mêlộ hay cách thức xây dựng mêlộ. Đây là hướng tiếp cận của mẫu Builder. Trong các slide sau chúng ta sẽ tìm hiểu các mẫu phần mềm này. Giải pháp khắc phục Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 272 Abstract Factory Chương 11 : Các mẫu Creational ‰ Mục tiêu : cung cấp interface cho việc khởi tạo ₫ối tượng mà không cần xác ₫ịnh trước lớp cụ thể (concrete) tương ứng. ‰ Nhu cầu áp dụng : có những trường hợp khi xây dựng chương trình chúng ta chưa biết chính xác hay chưa muốn ràng buộc lớp nào sẽ ₫ược sử dụng ₫ể sinh ra ₫ối tượng, chẳng hạn: ƒ chương trình có khả năng chạy trên nhiều platform. Mỗi platform có một họ các lớp giao diện, việc sử dụng cụ thể họ lớp giao diện nào chỉ biết khi chương trình chạy. ƒ framework cần khởi tạo ₫ối tượng nhưng chưa biết trước lớp cụ thể sẽ sử dụng. Những chương trình như vậy thường có một số yêu cầu ₫ối với người thiết kế: ƒ code chương trình phải có khả năng tương tác tổng quát lên các ₫ối tượng sẽ ₫ược sinh ra. ƒ dễ chuyển ₫ổi giữa các họ ₫ối tượng. ƒ dễ bổ sung các họ ₫ối tượng mới. 137 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 273 ‰ Giải pháp ₫ề nghị: ƒ Cung cấp interface cho các ₫ối tượng dự ₫ịnh sẽ ₫ược khởi tạo khi hệ thống chạy, gọi là AbstractProduct. ƒ Cung cấp interface ₫ể khởi tạo các ₫ối tượng kiểu AbstractProduct, gọi là AbstractFactory. ƒ Để khởi tạo một ₫ối tượng cụ thể, cần xây dựng 2 lớp concrete: một lớp hiện thực interface AbstractFactory ₫ể khởi tạo ₫ối tượng từ lớp hiện thực AbstractProduct. Hướng tiếp cận trên là của mẫu Abstract Factory. Ví dụ về quá trình khởi tạo ₫ối tượng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 274 Thí dụ về mẫu AbstractFactory Chương 11 : Các mẫu Creational WidgetFactory CreateScrollbar() CreateWindow() MotifWidgetFactory CreateScrollbar() CreateWindow() PMWidgetFactory CreateScrollbar() CreateWindow() Window Client PMWindow MotifWindow Scrollbar PMScrollbar MotifScrollbar 138 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 275 AbstractFactory CreateProductA() CreateProductB() ConcreteFactory1 CreateProductA() CreateProductB() ConcreteFactory2 CreateProductA() CreateProductB() AbstractProductA Client ProductA2 ProductA1 AbstractProductB ProductB2 ProductB1 Sơ ₫ồ cấu trúc của mẫu AbstractFactory Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 276 ‰ AbstractFactory : ₫ịnh nghĩa interface cho việc khởi tạo ₫ối tượng. Thường là lớp Abstract. ‰ ConcreteFactory : hiện thực các method trong interface AbstractFactory ₫ể tạo ra các ₫ối tượng cụ thể. Hệ thống có nhiều ConcreteFactory, mỗi ConcreteFactory sinh ra một nhóm ₫ối tượng, các nhóm ₫ối tượng do các ConcreteFactory sinh ra tương ₫ồng nhau về vai trò. ‰ AbstractProduct : lớp Abstract, ₫ịnh nghĩa interface cho một kiểu lớp (kiểu lớp button, kiểu lớp Scrollbar…) ‰ ConcreteProduct : lớp hiện thực ₫ối tượng ₫ược sinh ra từ lớp ConcreteFactory tương ứng, thừa kế lớp Abstract Product. Các phần tử tham gia Chương 11 : Các mẫu Creational 139 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 277 ‰ Client : chương trình cần tạo các ₫ối tượng. Client chỉ sử dụng các interface AbstractFactory và AbstractProduct. ‰ Quá trình tương tác giữa các phần tử : ƒ Tại thời ₫iểm compile, Client nắm giữ pointer ₫ến phần tử của lớp AbstractFactory (giả sử là _factory). ƒ Tại thời ₫iểm run-time, Client biết cần sử dụng họ ₫ối tượng ConcreteProduct nào sẽ khởi tạo ₫ối tượng ConcreteFactory tương ứng và gán vào _factory. Client thông qua interface AbstractFactory ₫ể yêu cầu ₫ối tượng ConcreteFactory sinh ra các ₫ối tượng mong muốn. ƒ Client dựa vào interface của các ₫ối tượng ConcreteProduct ₫ược khai báo trong AbstractProduct ₫ể sử dụng các ₫ối tượng này. Các phần tử tham gia Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 278 ‰ hệ thống muốn xác ₫ịnh quá trình khởi tạo và sử dụng ₫ối tượng tại thời ₫iểm chạy chương trình. ‰ hệ thống muốn tương tác với một họ trong một tập hợp họ ₫ối tượng và việc chọn họ ₫ối tượng ₫ược xác ₫ịnh tại thời ₫iểm run-time. ‰ hệ thống muốn ràng buộc tính sử dụng ₫ồng thời các phần tử trong một họ ₫ối tượng. Các ngữ cảnh nên dùng mẫu Abstract Factory Chương 11 : Các mẫu Creational 140 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 279 ‰ Lớp MazeFactory (tương ứng phần tử Abstract Factory) cung cấp phương thức mặc ₫ịnh ₫ể khởi tạo các ₫ối tượng maze, wall, room, door. Các lớp con thừa kế có thể override các phương thức này ₫ể sinh ra các maze, wall, room, door khác. ‰ MazeFactory không sử dụng Constructor mà cung cấp các method Make ₫ể tạo ra các ₫ối tượng. ‰ MazeFactory có thể ₫ược hiện thực trong C++ như sau: class MazeFactory { public: MazeFactory(); virtual Maze* MakeMaze() const { return new Maze;} virtual Wall* MakeWall() const { return new Wall;} virtual Room* MakeRoom(int n) const { return new Room(n); } virtual Door* MakeDoor(Room* r1, Room* r2) const { return new Door(r1, r2); } Ví dụ áp dụng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 280 ‰ Lớp MazeGame ₫óng vai trò là Client sử dụng mẫu Abstract Factory. Phương thức CreateMaze ₫ược truyền một ₫ối tượng kiểu MazeFactory, CreateMaze sử dụng ₫ối tượng này ₫ể sinh ra các ₫ối tượng cần thiết. ‰ CreateMaze có thể ₫ược hiện thực trong C++ như sau: Maze* MazeGame::CreateMaze (MazeFactory& factory) { Maze* aMaze = factory.MakeMaze(); Room* r1 = factory.MakeRoom (1); Room* r2 = factory.MakeRoom (2); Door* aDoor = factory.MakeDoor(r1, r2); aMaze->AddRoom(r1); aMaze->AddRoom(r2); r1->SetSide(North, factory.MakeWall()); … return aMaze; } Ví dụ áp dụng Chương 11 : Các mẫu Creational 141 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 281 ‰ Để thay ₫ổi ₫ối tượng tạo ra, ta chỉ việc truyền một ₫ối tượng factory khác, miễn là ₫ối tượng này thuộc kiểu MazeFactory. ‰ VD ₫ể tạo một maze mà trong room có thể có bom, ta ₫ịnh nghĩa lớp RoomWithABomb thừa kế lớp Room và lớp BombedMazeFactory thừa kế lớp MazeFactory trong ₫ó override phương thức MakeRoom như sau: Room* BombedMazeFactory::MakeRoom(int n) const { return new RoomWithABomb(n); } Trong chương trình Game chỉ cần thực hiện ₫oạn code: MazeGame game; BombedMazeFactory factory; game.CreateMaze(factory); Ví dụ áp dụng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 282 ‰ Khi áp dụng mẫu Abstract Factory, chương trình có một số ₫ặc ₫iểm : ƒ có thể thích ứng với nhiều kiểu maze khác nhau. ƒ việc thêm một kiểu maze chỉ là thêm một họ các lớp, không ảnh hưởng ₫ến code chương trình ₫ã có. ƒ chương trình nhất quán trong việc sử dụng một họ các phần tử của cùng một kiểu maze, không xảy ra trường hợp 2 phần tử của 2 họ khác nhau cùng tồn tại trong code của client. ƒ việc bổ sung một loại phần tử vào maze sẽ gặp khó khăn vì phải bổ sung vào lớp MazeFactory, do ₫ó sẽ ảnh hưởng ₫ến hầu như tất cả các lớp khác. Ví dụ áp dụng Chương 11 : Các mẫu Creational 142 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 283 Factory Method Chương 11 : Các mẫu Creational ‰ Mục tiêu : ₫ịnh nghĩa interface ₫ể sinh ra ₫ối tượng nhưng ₫ể cho lớp con quyết ₫ịnh lớp nào ₫ược dùng ₫ể sinh ra ₫ối tượng. Factory Method cho phép một lớp chuyển quá trình khởi tạo ₫ối tượng cho lớp con. ‰ Nhu cầu áp dụng : ƒ Tương tự nhu cầu áp dụng ở mẫu Abstract Factory: cần phải cung cấp giải pháp tạo ₫ối tượng nhưng chưa biết ₫ược lớp cụ thể dùng ₫ể sinh ra ₫ối tượng. ƒ Hướng giải quyết theo mẫu Factory Method: thay vì tạo lớp Abstract Factory ₫ể tạo các ₫ối tượng như trong mẫu Abstract Factory, Factory Method tạo một phương thức ảo, các lớp con sẽ override phương thức này ₫ể khởi tạo ₫ối tượng. Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 284 Application CreateDocument() NewDocument() OpenDocument() MyDocument Sơ ₫ồ thí dụ Chương 11 : Các mẫu Creational Document Open() Close() Save() Revert() Document* doc=CreateDocument(); docs.Add(doc); doc->Open(); return new MyDocument; MyApplication CreateDocument() docs 143 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 285 Sơ ₫ồ cấu trúc của mẫu Factory method Chương 11 : Các mẫu Creational Creator FactoryMethod() AnOperation() ConcreteProduct Product ... Product = FactoryMethod(); ... return new ConcreteProduct; ConcreteCreator FactoryMethod() docs Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 286 ‰ Product : ₫ịnh nghĩa interface cho các ₫ối tượng sản phẩm. ‰ ConcreteProduct : lớp thể hiện ₫ối tượng sản phẩm cần tạo. Hiện thực interface Product. ‰ Creator : ₫ịnh nghĩa factory method, sản phẩm trả về là ₫ối tượng kiểu Product. ‰ ConcreteCreator : thừa kế lớp Creator, override factory method ₫ể trả về ₫ối tượng ConcreteProduct. Các phần tử tham gia Chương 11 : Các mẫu Creational 144 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 287 ‰ một lớp không biết trước lớp của ₫ối tượng mà nó cần khởi tạo. ‰ một lớp muốn lớp con của mình thay ₫ổi hay xác ₫ịnh lớp của ₫ối tượng cần khởi tạo. ‰ một lớp muốn chuyển quá trình hiện thực một nhiệm vụ nào ₫ó cho một trong các lớp con nhưng cho phép ứng dụng xác ₫ịnh lớp con cụ thể. Các ngữ cảnh nên dùng mẫu Factory Method Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 288 ‰ Lớp MazeGame ₫óng vai trò là Creator, cung cấp các factory method ₫ể tạo các ₫ối tượng: class MazeGame { public: Maze* CreateMaze(); // factory methods: virtual Maze* MakeMaze() const { return new Maze; } virtual Room* MakeRoom(int n) const { return new Room(n); } virtual Wall* MakeWall() const { return new Wall; } virtual Door* MakeDoor(Room* r1, Room* r2) const { return new Door(r1, r2); } }; Ví dụ áp dụng Chương 11 : Các mẫu Creational 145 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 289 ‰ Method CreateMaze có thể ₫ược ₫ịnh nghĩa lại như sau: Maze* MazeGame::CreateMaze () { Maze* aMaze = MakeMaze(); Room* r1 = MakeRoom(1); Room* r2 = MakeRoom(2); Door* theDoor = MakeDoor(r1, r2); aMaze->AddRoom(r1); aMaze->AddRoom(r2); r1->SetSide(North, MakeWall()); //……. r2->SetSide(North, MakeWall()); //……. return aMaze; } Ví dụ áp dụng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 290 ‰ Các maze game khác muốn thay ₫ổi phần tử trong game thì: ƒ Định nghĩa các lớp thừa kế từ các lớp thể hiện các phần tử tương ứng VD: RoomWithABomb thừa kế Room. ƒ Định nghĩa lớp thừa kế lớp MazeGame, trong lớp này override factory method tạo ra ₫ối tượng muốn thay ₫ổi. VD: class BombedMazeGame : public MazeGame { public: BombedMazeGame(); virtual Wall* MakeWall() const { return new BombedWall; } virtual Room* MakeRoom(int n) const { return new RoomWithABomb(n); } }; Ví dụ áp dụng Chương 11 : Các mẫu Creational 146 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 291 Prototype Chương 11 : Các mẫu Creational ‰ Mục tiêu : giúp khởi tạo ₫ối tượng bằng cách copy một ₫ối tượng khác (prototype) ₫ang tồn tại. ‰ Nhu cầu áp dụng : ƒ Muốn tạo ₫ối tượng nhưng không biết hoặc không muốn sử dụng lớp Concrete. Ví dụ Editor Framework cho phép ứng dụng bổ sung các control vào toolbox nhưng chưa biết lớp cụ thể sẽ sinh ra Control. ƒ Giải pháp ₫ề nghị : + Framework cung cấp interface ₫ể copy một ₫ối tượng, interface này sẽ ₫ược các lớp concrete cần sinh ra ₫ối tượng implement. + Ứng dụng phát triển từ Framework hay component tạo ra ₫ối tượng mong muốn, sau ₫ó mỗi lần tạo thêm một ₫ối tượng bằng cách gọi hàm copy ₫ối tượng này. Đây chính là phương pháp của mẫu Prototype. Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 292 Ví dụ về mẫu Prototype Chương 11 : Các mẫu Creational Tool Manipulate() return copy of self; prototype MusicsalNote Draw(Position) Clone() p = protoype->Clone(); while (user drag mouse) { p->Draw(new position); } insert p onto drawing WholeNote Draw(Position) Clone() return copy of self; HalfNote Draw(Position) Clone() MusicalNoteStaff Draw(Position) Clone() GraphicTool Manipulate() RotateTool Manipulate() 147 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 293 Sơ ₫ồ cấu trúc của mẫu Prototype Chương 11 : Các mẫu Creational Client Operation() return copy of self; return copy of shelf; prototype Prototype Clone() p = protoype->Clone(); ConcretePrototype1 Clone() ConcretePrototype2 Clone() Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 294 ‰ Prototype: cung cấp interface ₫ể copy chính nó (clone) ‰ ConcretePrototype: hiện thực interface ₫ược cung cấp bởi Prototype ₫ể copy chính nó. ‰ Client: tạo mới ₫ối tượng bằng cách yêu cầu một ₫ối tượng ₫ã có (prototype) copy chính nó. Các phần tử tham gia Chương 11 : Các mẫu Creational 148 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 295 ‰ Class có thể cung cấp phương thức ₫ể set giá trị cho ₫ối tượng sau khi ₫ược tạo ra bằng cách copy từ prototype. ‰ Nếu số lượng prototype trong ứng dụng không cố ₫ịnh, nên quản lý chúng bằng một ₫ối tượng prototype manager. Đối tượng này chứa các tham khảo ₫ến các prototype và các key tương ứng ₫ể truy xuất chúng. ‰ Việc hiện thực phương thức clone phụ thuộc nhiều vào ngôn ngữ lập trình. Có thể copy hoàn toàn (deep copy) hay share biến (shallow copy). ‰ Java, SmallTalk, Eiffel cung cấp phương thức clone(). C++ có phương thức copy. ‰ Tất cả những phương thức trên ₫ều mặc ₫ịnh thực hiện shallow copy. ‰ Khi hiện thực deep copy, ₫ể ý vấn ₫ề tham khảo vòng. Một số vấn ₫ề hiện thực Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 296 ‰ Mẫu Prototype thường ₫ược sử dụng khi hệ thống cần ₫ộc lập với các ₫ối tượng mà nó sinh ra và ƒ khi lớp cần dùng ₫ể sinh ₫ối tượng ₫ược xác ₫ịnh tại thời ₫iểm chương trình chạy (dynamic loading), hoặc ƒ tránh trường hợp xây dựng số lượng các phần tử khởi tạo ₫ối tượng ngang bằng với số lượng kiểu ₫ối tượng bổ sung dự ₫ịnh tạo ra, hoặc ƒ khi các ₫ối tượng của cùng một class có ít ₫iểm khác biệt. Các ngữ cảnh nên dùng mẫu Prototype Chương 11 : Các mẫu Creational 149 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 297 ‰ Chương trình này phát triển từ ví dụ áp dụng mẫu Abstract Factory. ‰ Định nghĩa lớp MazePrototypeFactory thừa kế lớp MazeFactory, ₫ối tượng lớp này ₫ược cung cấp các prototype ₫ể tạo ra các ₫ối tượng cùng loại. MazePrototypeFactory có thể ₫ược hiện thực trong C++ như sau: class MazePrototypeFactory : public MazeFactory{ public: MazePrototypeFactory(Maze*, Wall*, Room*, Door*); virtual Maze* MakeMaze() const; ...// Các method khởi tạo các phần tử của maze private: Maze* _mazePrototype; Room* _roomPrototype; Wall* _wallPrototype; Door* _doorPrototype; } Ví dụ áp dụng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 298 ‰ Constructor của lớp MazePrototypeFactory chỉ khởi tạo các prototype với các ₫ối tượng tương ứng ₫ược cung cấp từ ứng dụng: MazePrototypeFactory::MazePrototypeFactory ( Maze* m, Wall* w, Room* r, Door* d ) { _mazePrototype = m; _wallPrototype = w; _roomPrototype = r; _doorPrototype = d; } Ví dụ áp dụng Chương 11 : Các mẫu Creational 150 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 299 ‰ Các lớp Door, Wall, Room ₫ều phải hiện thực phương thức clone thừa kế từ lớp MapSite và các phương thức set giá trị nếu cần: class Door : public MapSite { public: Door(); Door(const Door&); virtual void Initialize(Room*, Room*); virtual Door* Clone() const; private: Room* _room1; Room* _room2; }; Door::Door (const Door& other) { _room1 = other._room1; _room2 = other._room2; } void Door::Initialize (Room* r1, Room* r2) { _room1 = r1; _room2 = r2; } Door* Door::Clone () const { return new Door(*this); } Ví dụ áp dụng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 300 ‰ Các phương thức khởi tạo wall, room, door ₫ều clone prototype có sẵn và set các giá trị nếu cần: Wall* MazePrototypeFactory::MakeWall () const { return _wallPrototype->Clone(); } Door* MazePrototypeFactory::MakeDoor (Room* r1, Room *r2) const { Door* door = _doorPrototype->Clone(); door->Initialize(r1, r2); return door; } Ví dụ áp dụng Chương 11 : Các mẫu Creational 151 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 301 ‰ Để thay ₫ổi maze cần tạo, ta chỉ cần cung cấp các factory cho constructor của MazePrototypeFactory : MazeGame game; MazePrototypeFactory bombedMazeFactory( new Maze, new BombedWall, new RoomWithABomb, new Door ); Maze* maze = game.CreateMaze(bombedMazeFactory); ‰ Khi bổ sung phần tử sản phẩm mới (VD: roomWithABomb), không cần phải cung cấp lớp Factory (BombedMazeFactory) ₫ể sinh ra các sản phẩm này mà chỉ cần cung cấp prototype của sản phẩm ₫ó. Ví dụ áp dụng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 302 Mẫu Builder Chương 11 : Các mẫu Creational ‰ Mục tiêu : tách việc xây dựng ₫ối tượng phức tạp khỏi việc miêu tả nó sao cho cùng 1 qui trình xây dựng có thể tạo ra nhiều sự miêu tả khác nhau. ‰ Nhu cầu áp dụng : ƒ Trình ₫ọc file RTF cần ₫ổi file RTF sang 1 số dạng khác chưa biết trước như text thô, Tex,... hay sang 1 ₫iều khiển soạn thảo text. ƒ Giải pháp ₫ề nghị : + ₫ịnh nghĩa class TextConverter chứa các tác vụ chuyển ₫ổi token cơ bản. + Mỗi ₫ịnh dạng cần chuyển tới sẽ ₫ược ₫ảm trách bởi 1 subclass của class TextConverter. Đây chính là phương pháp của mẫu Builder. 152 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 303 Ví dụ về mẫu Builder Chương 11 : Các mẫu Creational RTFReader ParseRTF() builder while (t=getnexttoken()) { switch (t.type) { case CHAR : builder->ConvertCharacter(t.Char); break; case FONT : builder->ConvertFont(t.Font); break; case PARA : builder->ConvertParagraph(); } } ASCIIConverter ConvertCharacter() GetASCIIText() TextConverter ConvertCharacter() ConvertFont() ConvertParagraph() TeXConverter ConvertCharacter() ConvertFont() ConvertParagraph() GetTeXText() TextWidgetConverter ConvertCharacter() ConvertFont() ConvertParagraph() GetTextWidget() ASCIIText TeXText TextWidget builders Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 304 Sơ ₫ồ cấu trúc của mẫu Builder Chương 11 : Các mẫu Creational Director Construct() builder forall objects in structure { builder->BuildPart(); } Builder BuildPart() ConcreteBuilder1 BuildPart() GetResult() Product1 builders ConcreteBuilder2 BuildPart() GetResult() Product2 ConcreteBuilder3 BuildPart() GetResult() Product3 153 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 305 ‰ Director (RTFReader) : xây dựng ₫ối tượng dùng interface Builder. ‰ Builder (TextConverter) : cung cấp interface ₫ể xây dựng các phần của ₫ối tượng Product. ‰ ConcreteBuilder (ASCIIConverter, TeXConverter) : ƒ xây dựng và lắp ghép các phần của Product bằng cách hiện thực interface của class Builder. ƒ ₫ịnh nghĩa và ghi giữ ₫ối tượng mà nó tạo ra. ƒ cung cấp interface ₫ể nhận ₫ối tượng. ‰ Product (ASCIIText, TeXText) : ƒ miêu tả ₫ối tượng phức tạp cần xây dựng. ƒ bao gồm các class ₫ịnh nghĩa các thành phần bao gồm interface phục vụ việc lắp ghép các thành phần thành kết quả cuối cùng. Các phần tử tham gia Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 306 ‰ Mẫu Builder thường ₫ược sử dụng khi : ƒ giải thuật tạo ₫ối tượng phức tạp nên ₫ộc lập với các phần cấu thành ₫ối tượng và cách lắp ghép chúng. ƒ qui trình xây dựng phải cho phép xây dựng nhiều biến thể khác nhau của ₫ối tượng Các ngữ cảnh nên dùng mẫu Builder Chương 11 : Các mẫu Creational 154 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 307 ‰ Ta xây dựng interface của builder bằng class MazeBuilder sau : class MazeBuilder { protected: MazeBuilder(); public: // methods: virtual void BuildMaze() { }; virtual void BuildRoom (int n) { }; virtual void BuildDoor (int roomFrom, int RoomTo) { } ; virtual Maze* GetMaze() { return 0; }; }; Ví dụ áp dụng Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 308 ‰ Ta hiệu chỉnh hàm CreateMaze() của class MazeGame thành : Maze* Mazegame::CreateMaze (MazeBuilder& builder) { builder.BuildMaze(); builder.BuildRoom(1); builder.BuildRoom(2); builder.BuildDoor(1,2); return builder.GetMaze(); } ‰ Ta có thể ₫ịnh nghĩa các subclass của class MazeBuilder ₫ể tạo ra các Maze khác nhau và tạo ₫ối tượng của subclass này rồi truyền nó như là tham số của hàm CreateMaze() ₫ể tạo các Maze khác nhau. Ví dụ áp dụng Chương 11 : Các mẫu Creational 155 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 309 Singleton Chương 11 : Các mẫu Creational ‰ Mục tiêu : ₫ảm bảo mỗi class chỉ có 1 instance và cung cấp 1 ₫iểm truy xuất toàn cục ₫ến ₫ối tượng. ‰ Nhu cầu áp dụng : ƒ chỉ 1 "printer spooler" ₫ể quản lý các máy in. ƒ chỉ 1 trình quản lý cho các file của hệ thống file. ƒ chỉ 1 trình quản lý windows cho các cửa sổ trên màn desktop... Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 310 Sơ ₫ồ cấu trúc của mẫu Singleton Chương 11 : Các mẫu Creational return uniqueInstance ; Singleton static Instance() SingletonOperation() GetSingletonData() static uniqueInstance singletonData 156 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 311 ‰ Singleton : ƒ ₫ịnh nghĩa tác vụ Instance giúp client truy xuất instance duy nhất của class. Instance() là tác vụ chung của class (hàm static trong C++). ƒ chịu trách nhiệm về việc tạo instance duy nhất cho class. ‰ Cộng tác giữa các ₫ối tượng : các clients truy xuất instance của class Singleton thông qua việc gọi tác vụ Instance() của class. Các phần tử tham gia Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 312 Trường Đại Học Bách Khoa Tp. HCM Khoa Công nghệ Thông tin Chương 12 CÁC MẪU BEHAVIORAL ƒ Mẫu Chain of Responsibility ƒ Mẫu Template Method ƒ Mẫu Strategy ƒ Mẫu Command ƒ Mẫu State ƒ Mẫu Observer Chương 11 : Các mẫu Creational 157 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 313 ‰ Tập trung vào giải thuật và sự phân bố công việc giữa các object ‰ Class patterns sử dụng thừa kế ₫ể chuyển giao thao tác giữa các class. ‰ Object patterns sử dụng tính ₫a hình và bao gộp ₫ể truyền thao tác từ ₫ối tượng này sang ₫ối tượng khác. ‰ Các slide sau sẽ giới thiệu các pattern Chain of Responsibility, Template Method (class pattern), Strategy (object pattern) và Command (object Pattern),.. Behavioral Patterns Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 314 Mẫu Chain of Responsibility Chương 11 : Các mẫu Creational ‰ Mục tiêu : Tránh việc gắn kết cứng giữa phần tử gởi request với phần tử nhận và xử lý request bằng cách cho phép hơn 1 ₫ối tượng có cơ hội xử lý request. Liên kết các ₫ối tượng nềhận request thành dây chuyền rồi "pass" request xuyên qua từng ₫ối tượng xử lý ₫ến khi gặp ₫ối tượng xử lý cụ thể. ‰ Nhu cầu áp dụng : Trong ứng dụng có trợ giúp theo ngữ cảnh thì user có thể thu ₫ược thông tin trợ giúp của 1 phần tử giao diện nào ₫ó bằng cách chỉ cần click vào nó. Ta nên tổ chức thông tin trợ giúp theo tính tổng quát từ phần tử ₫ặc biệt nhất (nhỏ nhất) ₫ến tổng quát nhất (lớn nhất), mỗi thông tin trợ giúp ₫ược xử lý bởi ₫ối tượng giao diện tương ứng phụ thuộc vào ngữ cảnh. 158 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 315 aPrintButton handler anOKButton handler aSavingDialog handler aPrintDialog handler anApplication handler Thí dụ về mẫu Chain of Responsibility Chương 11 : Các mẫu Creational ‰ Thí dụ khi ấn phải chuột vào button OK thì trình trợ giúp của OKButton sẽ chạy, nó sẽ hoặc hiển thị Help hoặc chuyển ₫iều khiển cho trình trợ giúp của Dialog, trình trợ giúp của Dialog có thể chuyển ₫iều khiển ₫ến Application... Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 316 Thí dụ về mẫu Chain of Responsibility Chương 11 : Các mẫu Creational HelpHandler HandleHelp() handler handler->HandleHelp(); Button HandleHelp() ShowHelp() Application Widget Dialog if (can handle) ShowHelp(); else Handler::HandleHelp(); 159 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 317 Lược ₫ồ cấu trúc của mẫu Chain of Responsibility Chương 11 : Các mẫu Creational Handler HandleRequest() successor ConcreteHandler1 HandleRequest() Client ConcreteHandler2 HandleRequest() aClient aHandler aConcreteHandler successor aConcreteHandler successor Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 318 ‰ Handler (HelpHandler) : ƒ ₫ịnh nghĩa interface của tác vụ xử lý request. ƒ (optional) hiện thực mối liên kết ₫ến ₫ối tượng ₫i sau (successor). ‰ ConcreteHandler (PrintButton, PrintDialog) : ƒ xử lý request mà nó có trách nhiệm xử lý. ƒ có thể truy xuất ₫ối tượng ₫i sau. ƒ nếu có thể xử lý ₫ược request, nó sẽ xử lý, nếu không forward request cho ₫ối tượng ₫i sau giải quyết. ‰ Client : ƒ khởi ₫ộng request và gởi tới 1 ConcreteHandler ₫ầu tiên trong dây chuyền. Các phần tử tham gia Chương 11 : Các mẫu Creational 160 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 319 ‰ Thường áp dụng mẫu Chain of Responsibility trong các trường hợp sau: ƒ hơn 1 ₫ối tượng có thể xử lý request nhưng ₫ối tượng nào sẽ xử lý thì chưa biết trước. Đối tượng xử lý sẽ ₫ược xác ₫ịnh ₫ộng. ƒ bạn muốn gởi request ₫ến 1 ₫ối tượng xử lý nào ₫ó nhưng không xác ₫ịnh rõ ràng. ƒ muốn xác ₫ịnh tập các ₫ối tượng xử lý 1 request nào ₫ó 1 cách ₫ộng. Các ngữ cảnh nên dùng mẫu Chain of Responsibility Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 320 Template Method Chương 11 : Các mẫu Creational ‰ Mục tiêu : ₫ịnh nghĩa bộ khung giải thuật trong một tác vụ nhưng cho phép các class con hiện thực một số phần của tác vụ ₫ó. ‰ Nhu cầu áp dụng : trong trường hợp Windows cho phép người lập trình Hook vào hệ thống, Windows ₫ã ₫ể sẵn những entry mà người lập trình có thể chèn thêm phần xử lý của mình. Người lập trình không thể thay thế trình tự quá trình xử lý của Windows. Phương pháp lập trình hướng ₫ối tượng có thể cung cấp hướng giải quyết những vấn ₫ề này như sau: ƒ Một lớp ₫ịnh nghĩa quá trình xử lý bao gồm nhiều tác vụ nhỏ hơn, các tác vụ nhỏ hơn có thể cho lớp con override chính là các ₫iểm hook. ƒ Các lớp con thừa kế hook vào quá trình xử lý của lớp cha bằng cách override các ₫iểm hook. Hướng tiếp cận như trên là của mẫu Template Method. 161 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 321 Document Save() Open() Close() DoRead() document Application AddDocument() OpenDocument() DoCreateDocument() CanOpenDocument() AboutToOpenDocument() MyDocument DoRead() MyApplication DoCreateDocument() CanOpenDocument() AboutToOpenDocument() return new MyDocument; docs Ví dụ về mẫu Template Method Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 322 AbstractClass TemplateMethod() PrimitiveOperation1() PrimitiveOperation2() ... PrimitiveOperation1(); ... PrimitiveOperation2(); ... ConcreteClass PrimitiveOperation1() PrimitiveOperation2() Sơ ₫ồ cấu trúc mẫu Template Method Chương 11 : Các mẫu Creational 162 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 323 ‰ AbstractClass (Application) : ƒ ₫ịnh nghĩa các primitive operation cho lớp con override ₫ể hiện thực một phần của hoạt ₫ộng. Các phương thức này là ₫iểm mà lớp con có thể hook vào code của lớp cha. ƒ hiện thực template method, là method ₫ịnh nghĩa bộ khung của hoạt ₫ộng. Template method kết hợp các primitive operation ₫ể thực hiện trọn vẹn hoạt ₫ộng. ‰ ConcreteClass (MyApplication) : hiện thực các primitive operation ₫ể can thiệp một phần vào quá trình thực hiện hoạt ₫ộng ở lớp cha. Các phần tử tham gia Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 324 ‰ Thường sử dụng Template method khi cần: ƒ hiện thực một phần cố ₫ịnh của hoạt ₫ộng và cho phép lớp con hiện thực phần có thể thay ₫ổi. ƒ tập trung các hành vi giống nhau ở các lớp ₫ể tránh trùng lắp. ƒ kiểm soát quá trình override của lớp con: chỉ cho phép override những ₫iểm hook qui ₫ịnh sẵn. Các ngữ cảnh nên dùng mẫu Template Method Chương 11 : Các mẫu Creational 163 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 325 Mẫu Strategy Chương 11 : Các mẫu Creational ‰ Mục tiêu : Cung cấp một họ giải thuật và cho phép Client chọn lựa linh ₫ộng một giải thuật cụ thể khi sử dụng. ‰ Nhu cầu áp dụng : Một số chương trình có nhiều giải thuật khác nhau cho cùng một vấn ₫ề. Nhu cầu phát sinh: quản lý các giải thuật ₫ó một cách ₫ơn giản và cho phép client chọn một trong những giải thuật ₫ó ₫ể sử dụng một cách linh ₫ộng. Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 326 Ví dụ về nhu cầu ứng dụng Strategy Chương 11 : Các mẫu Creational Chương trình chơi game có thể có nhiều giải thuật tùy vào mức ₫ộ khó của cuộc chơi. Khi người chơi chọn mức ₫ộ khó dễ chính là thao tác chọn giải thuật. Do ₫ó ₫ối tượng giải thuật phải tách biệt với code chương trình. Một hướng giải quyết ₫ược ₫ề nghị như sau: ƒ Định nghĩa 1 interface chung cho các lớp thể hiện các giải thuật. ƒ Định nghĩa các lớp concrete hiện thực interface trên, mỗi lớp concrete thể hiện một giải thuật. ƒ Chương trình sử dụng ₫ối tượng kiểu interface và cho phép client thay thế bằng ₫ối tượng thể hiện giải thuật cụ thể khi chạy. → hướng giải quyết vấn ₫ề của mẫu Strategy. 164 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 327 Composition Traverse() Repair() compositor->Compose(); compositor Ví dụ về mẫu Strategy Chương 11 : Các mẫu Creational Compositor Compose() ArrayCompositor Compose() TeXCompositor Compose() SimpleCompositor Compose() Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 328 Context ContextInterface() strategy Lược ₫ồ cấu trúc của mẫu Strategy Chương 11 : Các mẫu Creational Strategy AlgorithmInterface() ConcreteStrategyA AlgorithmInterface() ConcreteStrategyB AlgorithmInterface() ConcreteStrategyC AlgorithmInterface() 165 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 329 ‰ Strategy (Compositor) : ₫ịnh nghĩa interface cho tất cả các lớp thể hiện giải thuật. Có thể nhận pointer ₫ến ₫ối tượng Context trong quá trình khởi tạo ₫ối tượng ₫ể truy xuất dữ liệu trong Context. ‰ ConcreteStrategy (SimpleCompositor, TeXCompositor..) : hiện thực interface Strategy, thể hiện một giải thuật cụ thể. ‰ Context (Composition) : ƒ tại thời ₫iểm dịch: chỉ sử dụng ₫ối tượng kiểu Strategy khi xác ₫ịnh giải thuật cho vấn ₫ề cần xử lý. ƒ tại thời ₫iểm run-time: ₫ược cung cấp một ₫ối tượng giải thuật cụ thể thay thế cho ₫ối tượng Strategy. ƒ có thể cung cấp entry cho phép ₫ối tuợng kiểu Strategy truy xuất dữ liệu. Các phần tử tham gia Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 330 ‰ Thường áp dụng mẫu Strategy trong các trường hợp sau: ƒ Một lớp có nhiều hành vi loại loại trừ lẫn nhau và quá trình chuyển từ hành vi này sang hành vi khác cần ₫ược thực hiện dễ dàng. Khi ₫ó mỗi hành vi sẽ ₫ược thể hiện trong 1 lớp Concrete Strategy và lớp có nhiều hành vi là lớp Strategy. ƒ Giải thuật cần ₫ược che dấu cả về dữ liệu và cấu trúc ₫ối với chương trình Client. ‰ Một số chương trình có thể áp dụng Strategy : ƒ Compiler, OS: quá trình tối ưu hóa ƒ Game: Quá trình chọn giải thuật ƒ Các giao diện tổng quát (common dialog trong VB…) Các ngữ cảnh nên dùng mẫu Strategy Chương 11 : Các mẫu Creational 166 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 331 Mẫu Command Chương 11 : Các mẫu Creational ‰ Mục tiêu : ₫óng gói request vào trong một Object, nhờ ₫ó có thể thông số hóa chương trình nhận request và thực hiện các thao tác trên request: sắp xếp, log, undo… ‰ Nhu cầu áp dụng : Đôi khi chúng ta cần gửi request ₫ến ₫ối tượng nhưng không biết ₫ược hành ₫ộng sẽ ₫ược thực thi cũng như những ₫ối tượng bị tác ₫ộng bởi request ₫ó. Ví dụ user interface toolkit cần xây dựng trước việc truyền request ₫ến menu và button nhưng chỉ có ứng dụng cụ thể mới xác ₫ịnh ₫ược hành ₫ộng khi click vào chúng. Vấn ₫ề này có thể ₫ược giải quyết như sau: Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 332 Ví dụ về nhu cầu ứng dụng mẫu Command Chương 11 : Các mẫu Creational ƒ Xây dựng lớp trừu tượng Command, trong ₫ó có phương thức trừu tượng Execute(). ƒ Menu hay button giữ liên kết ₫ến ₫ối tượng kiểu Command ƒ Request ₫ược ₫óng gói trong các ₫ối tượng thừa kế Command. Các ₫ối tượng này override phương thức Execute() ₫ể xác ₫ịnh hành ₫ộng khi thực thi request. ƒ Khi ứng dụng cần gửi request ₫ến cho menu hay button chỉ cần gửi ₫ối tượng có ₫óng gói request ₫ó ₫i. Menu hay button sẽ gọi phương thức Execute() trên ₫ối tượng ₫ó. 167 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 333 Ví dụ về mẫu Command Chương 11 : Các mẫu Creational Menu Add(MenuItem) Command Execute() command command->Execute(); Document Open() Close() Cut() Copy() Paste() Application Add(Document) MenuItem Clicked() Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 334 Ví dụ về mẫu Command Chương 11 : Các mẫu Creational Command Execute() PasteCommand Execute() Document Open() Close() Cut() Copy() Paste() document document->Paste(); ‰ Thí dụ ₫ối tượng PasteCommand hỗ trợ hoạt ₫ộng dán text từ clipboard vào 1 tài liệu. Phần tử nhận của PasteCommand là ₫ối tượng Document mà PasteCommand ₫ược cung cấp trong lúc "instantiation". tác vụ Execute gọi chức năng Paste trên Document nhận ₫ược. 168 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 335 Ví dụ về mẫu Command Chương 11 : Các mẫu Creational ‰ Tác vụ Execute của OpenCommand thì khác : nó hiển thị cửa sổ yêu cầu user nhập tên document rồi tạo ₫ối tượng Document tương ứng, "add" document vào ứng dụng nhận rồi mở document. Command Execute() OpenCommand Execute() AskUser() Application Add(Document) application name = AskUser(); doc = new Document(name); application-.Add(doc); doc->Open(); Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 336 Ví dụ về mẫu Command Chương 11 : Các mẫu Creational ‰ Đôi khi 1 option Menu cần thực thi 1 chuỗi các lệnh, chúng ta có thể ₫ịnh nghĩa class MacroCommand ₫ể cho phép thi hành 1 số lệnh chưa biết trước. Command Execute() MacroCommand Execute() commands forall c in commands c->Execute(); 169 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 337 Lược ₫ồ class của mẫu Command Chương 11 : Các mẫu Creational Command Execute() receiver receiver->Action(); InvokerClient Receiver Action() ConcreteCommand Execute() state Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 338 ‰ Command : Khai báo các phương thức ảo (Execute()…) ₫ể gọi thực thi hay quản lý request. ‰ ConcreteCommand (PasteCommand, OpenCommand): ƒ Xác ₫ịnh ₫ối tượng nhận tương tác (₫ối tượng lớp Receiver). ƒ Override phương thức Execute trong lớp Command ₫ể ₫áp ứng request. ‰ Client (Application) : khởi tạo ₫ối tượng ConcreteCommand và truyền ₫ối tượng nhận tương tác cho nó. ‰ Invoker (MenuItem): gửi request ₫ến ₫ối tượng Command. ‰ Receiver (Document, Application) : ƒ Đối tượng nhận tương tác trong ConcreteCommand. ƒ Biết cách thực hiện những hành ₫ộng ₫ể ₫áp ứng request. Các phần tử tham gia Chương 11 : Các mẫu Creational 170 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 339 Quá trình cộng tác giữa các phẩn tử Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 340 ‰ Thông số hóa ₫ối tượng bằng hành vi mà ₫ối tượng ₫ó thực thi. Nghĩa là một entry của ₫ối tượng có thể thực thi nhiều hành vi khác nhau tùy thuộc vào thông số (là ₫ối tượng khác) truyền cho nó. ‰ Quản lý, lưu trữ và thực thi request tại những thời ₫iểm khác nhau. Vì trong mẫu Command, request ₫ược lưu trữ trong các ₫ối tượng nên việc lưu trữ và quản lý request chỉ là việc lưu trữ và quản lý các ₫ối tượng. ‰ Hỗ trợ undo, redo các thao tác. Phương thức Execute() có thể lưu trạng thái cũ của ₫ối tượng Receiver ₫ể phục hồi lại khi có yêu cầu. ‰ Hỗ trợ việc log lại các thay ₫ổi trên ₫ối tượng Receiver ₫ể có thể thực hiện trở lại trong trường hợp ứng dụng chưa lưu ₫ối tượng Receiver ₫ã thay ₫ổi mà hệ thống lại bị hỏng. (Ví dụ MS Word có chức năng recovery). ‰ Các hệ thống hỗ trợ transaction. Trường hợp này có thể kết hợp mẫu Template Method. Các ngữ cảnh nên dùng mẫu Command Chương 11 : Các mẫu Creational 171 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 341 Mẫu State Chương 11 : Các mẫu Creational ‰ Mục tiêu : cho phép 1 ₫ối tượng thay ₫ổi hành vi khi trạng thái bên trong của nó thay ₫ổi. Ta có cảm giác như class của ₫ối tượng bị thay ₫ổi. ‰ Nhu cầu áp dụng : trong class TCPConnection miêu tả 1 mối nối mạng, ₫ối tượng TCPConnection có thể ở 1 trong nhiều trạng thái : Established, Listening, Closed. Khi ₫ối tượng TCPConnection nhận request, nó sẽ ₫áp ứng khác nhau tùy vào trạng thái hiện hành. → hướng giải quyết vấn ₫ề của mẫu State. Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 342 state->Open(); state Ví dụ về mẫu State Chương 11 : Các mẫu Creational TCPState Open() Close() Acknowledge() TCPConnection Open() Close() Acknowledge() TCPEstablished Open() Close() Acknowledge() TCPListen Open() Close() Acknowledge() TCPClosed Open() Close() Acknowledge() 172 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 343 Lược ₫ồ cấu trúc của mẫu State Chương 11 : Các mẫu Creational state->Handle(); state State Handle() ... Context Request() ... ConcreteStateA Handle() ... ConcreteStateB Handle() ... ConcreteStateC Handle() ... Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 344 ‰ Context (TCPConnection) : ƒ ₫ịnh nghĩa interface cần dùng cho client. ƒ duy trì 1 tham khảo ₫ến ₫ối tượng của 1 class con ConcreteState mà ₫ịnh nghĩa trạng thái hiện hành. ‰ State (TCPState) : ƒ ₫ịnh nghĩa interface nhằm bao ₫óng hành vi kết hợp với trạng thái cụ thể. ƒ duy trì 1 tham khảo ₫ến ₫ối tượng của 1 class con ConcreteState mà ₫ịnh nghĩa trạng thái hiện hành. ‰ ConcreteState (TCPEstablished, TCPListen, TCPClose) : ƒ ₫ịnh nghĩa hành vi cụ thể kết hợp với trạng thái của mình. Các phần tử tham gia Chương 11 : Các mẫu Creational 173 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 345 ‰ Thường áp dụng mẫu State trong các trường hợp sau: ƒ hành vi của ₫ối tượng phụ thuộc vào trạng thái của nó và phải thay ₫ổi run- time khi trạng thái thay ₫ổi. ƒ các tác vụ có những lệnh ₫iều kiện số học lớn phụ thuộc vào trạng thái ₫ối tượng. Các ngữ cảnh nên dùng mẫu State Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 346 Mẫu Observer Chương 11 : Các mẫu Creational ‰ Mục tiêu : ₫ịnh nghĩa sự phụ thuộc 1-n giữa các ối tượng sao cho khi 1 ₫ối tượng thay ₫ổi trạng thái thì các ₫ội tượng phụ thuộc ₫ược cảnh báo hầu hiệu chỉnh tự ₫ộng (₫ể ₫ảm bảo tính nhất quán). ‰ Nhu cầu áp dụng : trong ứng dụng quản lý bảng tính, mỗi bảng tính là 1 database nhưng nó ₫ược trình bày dưới nhiều dạng khác nhau như spreadsheet, barchart, piechart,... Mỗi khi nội dung database thay ₫ổi ta muốn cập nhật ₫ồng thời nhiều dạng biểu diễn nó. → hướng giải quyết vấn ₫ề của mẫu Observer. 174 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 347 Ví dụ về mẫu Observer Chương 11 : Các mẫu Creational Spreadsheet BarChart PieChart Database request, modification thay ₫ổi, notification Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 348 Lược ₫ồ cấu trúc của mẫu Observer Chương 11 : Các mẫu Creational forall o in observers o->Update(); observers Observer Update() Subject Attach(Observer) Detach(Observer) Notify() ConcreteObserver Update() observerState observerState = subject->GetState(); return subjectState(); ConcreteSubject GetState() SetState() subjectState 175 Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 349 ‰ Subject : ƒ biết observer của nó. Có thể có nhiều observer quan sát 1 subject. ƒ cung cấp interface ₫ể Attach va Detach các observer vào mình. ‰ Observer : ƒ ₫ịnh nghĩa interface hiệu chỉnh cho các ₫ối tượng mà sẽ ₫ược cảnh báo ₫ể hiệu chỉnh subject của mình. ‰ ConcreteSubject : ƒ lưu trạng thái lưu ý tới các ₫ối tượng ConcreteObserver. ƒ gởi cảnh báo tới các observer khi trạng thái của nó thay ₫ổi. ‰ Concretebserver : ƒ duy trì tham khảo tới ₫ối tượng ConcreteSubject. ƒ lưu trạng thái mà cần phải luôn nhất quán với subject của mình. ƒ hiện thực interface hiệu chỉnh ₫ể giữ trạng thái luôn nhất quán với subject của mình. Các phần tử tham gia Chương 11 : Các mẫu Creational Bö mön Cöng nghï phền mï̀m Khoa CNTT ĐH Bach Khoa Tp.HCM Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML Slide 350 ‰ Thường áp dụng mẫu State trong các trường hợp sau: ƒ khi 1 sự trừu tượng có 2 khía cạnh phụ thuộc lẫn nhau. Bao ₫óng các khía cạnh này trong những ₫ối tượng ₫ộc lập giúp ta thay ₫ổi và dùng lại chúng ₫ộc lập. ƒ khi việc thay ₫ổi ₫ối tượng này ₫òi hỏi phải thay ₫ổi các ₫ối tượng khác nhưng bạn không biết trước có bao nhiêu ₫ối tượng cần thay ₫ổi. ƒ khi ₫ối tượng cần có khả năng cảnh báo các ₫ối tượng khác nhưng không muốn chúng ghép nối chặt với nhau. Các ngữ cảnh nên dùng mẫu Observer Chương 11 : Các mẫu Creational

Các file đính kèm theo tài liệu này:

  • pdfPHÂN TÍCH & THIẾT KẾ HƯỚNG ĐỐI TƯỢNG DÙNG UML.pdf
Tài liệu liên quan