1. Trang chủ
  2. » Công Nghệ Thông Tin

C 3.0 Design Pattern Chương2

41 137 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

CHƯƠNG II: CÁC MẪU CẤU TRÚC: DECORATOR, PROXY, VÀ BRIDGE Chúng ta bắt đầu tour du lịch mẫu thiết kế với nhóm gọi mẫu cấu trúc Có bảy mẫu tạo nên nhóm cấu trúc, mẫu với vai trị việc xây dựng linh hoạt, tăng tuổi thọ, bảo mật vào phần mềm máy tính Tên mơ hình quan trọng, tơi giới thiệu chúng sau Đó là:  Decorator  Proxy  Bridge Composite Flyweight Adapter Faỗade Cỏc mẫu cấu trúc có liên quan với cách lớp đối tượng hợp thành để tạo thành cấu trúc lớn Trong số nhiều mục đích bảy mẫu cấu trúc, 10 mục đích:  Thêm chức tự động cho đối tượng có, loại bỏ (Decorator)  Kiểm sốt truy cập đến đối tượng (proxy)  Tạo đối tượng tốn theo yêu cầu (Proxy)  Cho phép phát triển giao diện thực thi thành phần cách độc lập (Bridge)  Kết hợp giao diện khơng tương thích (Adapter)  Giảm chi phí làm việc với số lượng lớn đối tượng nhỏ (Flyweight)  Tổ chức lại hệ thống với nhiều hệ thống vào định danh nht (Faỗade) Chn hoc chuyn i vic trin khai chạy (Bridge)  Đơn giản hóa giao diện cho hệ thống phức tạp (mặt tiền)  Đối xử với đối tượng đối tượng hỗn hợp cách (Composite) Các mẫu cấu trúc sử dụng hệ thống thiết kế, sau trình trì mở rộng Trong thực tế, số số chúng đặc biệt hữu ích giai đoạn hậu sản xuất vòng đời hệ thống phần mềm, thay đổi đưa mà chưa lường trước giao diện thành phần cần cập nhật Vì vậy, bạn muốn thêm chức năng, bạn làm việc với lớp học có mà khơng thể thay đổi Mẫu Decorator hữu ích Ngồi ra, bạn thiết kế hệ thống tồn từ đầu để hoạt động theo cách đặc biệt sử dụng được, với mẫu Composite Khám phá mẫu thiết kế cấu trúc kéo dài ba chương Trong chương này, xem xét mẫu Decorator, Proxy, Bridge Trong chương 3, giải mẫu Composite Flyweight, chương 4, s kim tra cỏc mu Adapter v Faỗade Ba mu cung cấp cách thêm trạng thái hành vi tự động, kiểm soát việc tạo truy cập đối tượng, giữ thông số kỹ thuật triển khai riêng biệt Chúng không sử dụng tính tiên tiến C#, dựa vào giao diện cho cấu trúc, nhiên, phần cuối chương này, giới thiệu phương pháp mở rộng cách thú vị để thực thi mẫu Bridge Đối với mẫu, xem xét vai trị nó, minh hoạ nơi sử dụng lập trình, thiết kế (những chúng vai trị chúng mơ hình) Sau chúng tơi xem xét số mã đơn giản minh họa việc thực mẫu ví dụ cụ thể Cuối cùng, xem xét số bổ sung thực tế sử dụng cho mẫu số tập mà bạn làm việc qua để nâng cao hiểu biết bạn Ngồi ra, vào cuối chương chương, bạn tìm thấy thảo luận chi tiết mẫu riêng lẻ sử dụng so sánh ý tưởng khả ứng dụng chúng Mẫu Decorator (trang trí) Vai trị Vai trò mẫu Decorator cung cấp cách để đưa trạng thái hành vi cho đối tượng tự động Các đối tượng khơng biết "trang trí", mà làm theo mẫu hữu ích cho phát triển hệ thống Một điểm quan trọng thực thi mẫu Decorator sử dụng kế thừa lớp ban đầu chứa thể Minh hoạ Như tên gọi cho thấy, mẫu Decorator có đối tượng có sẵn đối tượng thêm vào Ví dụ, xem xét ảnh hiển thị hình Có nhiều cách để thêm vào ảnh, chẳng hạn đặt biên giới xung quanh định thẻ liên quan đến nội dung Những bổ sung hiển thị đỉnh ảnh, thể hình 2-1 Hình 2-1 Hình minh họa mẫu Decorator (a) ảnh đơn giản (b) ảnh với thẻ Sự kết hợp hình ảnh ban đầu số nội dung tạo thành đối tượng Trong hình ảnh thứ hai thể hình 2-1, có bốn đối tượng: hình ảnh ban đầu thể bên trái, đối tượng cung cấp đường viền, hai đối tượng tag với liệu khác liên quan tới chúng Mỗi thứ đối tượng Decorator Cho số cách trang trí hình ảnh vơ tận, có nhiều đối tượng Vẻ đẹp mẫu là:  Các đối tượng ban đầu đồ vật trang trí  Khơng có class đầy tính lớn với tất tùy chọn  Các đồ trang trí độc lập với  Các đồ trang trí sáng tác thời trang trộn lẫn kết hợp Thiết kế Bây giờ, xác định thứ mẫu Decorator sơ đồ UML, thể hình 2-2 Bởi mẫu mô tả UML, đưa từ từ (UML mà cần cho mẫu sách đề cập Chương tóm tắt bảng 1-1.) Những thứ cần thiết sơ đồ UML là: Component Một lớp ban đầu đối tượng mà phải bổ sung sửa đổi thao tác (có thể có nhiều lớp vậy) Operation Một thao tác đối tượng IComponent mà thay (có thể có số thao tác) IComponent Giao diện mà xác định lớp đối tượng trang trí (Component lớp này) Decorator Một lớp có tuân theo giao diện IComponent bổ sung thêm trạng thái và/hoặc hành vi (có thể có nhiều lớp vậy) Hình 2-2 biểu đồ lớp UML mẫu Decorator Trung tâm sơ đồ UML lớp Decorator Nó bao gồm hai loại quan hệ với giao diện IComponent: Is-a Quan hệ is-a thể mũi tên chấm chấm từ Decorator đến IComponent, Decorator thưc thi giao diện IComponent Thực tế Decorator thừa kế từ IComponent có nghĩa đối tượng Decorator sử dụng nơi đối tượng IComponent mong đợi Lớp Component mối quan hệ is-a với IComponent, máy khách sử dụng đối tượng Component Decorator thay cho nhau-trung tâm mẫu Decorator Has-a Quan hệ has-a thể hình thoi mở Decorator, liên kết với IComponent Điều cho thấy Decorator khởi tạo nhiều đối tượng IComponent đối tượng trang trí sống lâu gốc Decorator sử dụng thuộc tính thành phần (loại IComponent) để gọi hoạt động thay ghi đè lên Đây cách mẫu Decorator đạt mục tiêu Thao tác addedBehavior thuộc tính addedState lớp Decorator cách tùy chọn khác việc mở rộng có đối tượng Component ban đầu Chúng ta xem xét số ví dụ giây lát Câu hỏi Khớp yếu tố mẫu Decorator với minh họa trang trí hình ảnh Để kiểm tra xem bạn hiểu mẫu Decorator, che cột trái bảng xem liệu bạn xác định đối tượng mục từ ví dụ minh họa (Hình 2-1), thể cột bên tay phải Sau kiểm tra câu trả lời bạn cột bên tay trái IComponent Bức ảnh Component Một ảnh đơn giản Operation Hiển thị ảnh Decorator Một ảnh gắn thẻ Client IComponent Tạo hình ảnh gắn thẻ ảnh Bức ảnh Từ danh sách này, thấy điều sau câu lệnh hợp lệ Client muốn đặt hai thẻ vào hình ảnh: Photo photo = new Photo( ); Tag foodTag = new Tag (photo, "Food",1); Tag colorTag = new Tag (foodTag, "Yellow",2); Do quan hệ is-a, photo, foodTag, colorTag tất đối tượng IComponent Mỗi thẻ (các trang trí) tạo với Component, mà hình ảnh ảnh gắn thẻ Dẫn đến sơ đồ đối tượng thể hình 2-3 Như bạn thấy, thực có ba đối tượng hình ảnh riêng biệt hệ thống Cách chúng tương tác thảo luận phần "Triển khai" tới Hình 2-3 Các đối tượng mẫu Decorator Trong hầu hết mẫu, gặp, đối tượng xuất nhiều vỏ bọc Để giữ cho sơ đồ UML rõ ràng đơn giản, tất tùy chọn hiển thị Tuy nhiên, nên xem xét tác động đối tượng thiết kế mẫu: Đa thành phần Các thành phần khác tuân theo giao diện trang trí Ví dụ, có lớp mà thu hút người, nhà cửa, tàu, từ hình dạng đơn giản đường Chúng gắn thẻ Đây lý mà giao diện IComponent quan trọng, khơng chứa thao tác Trong trường hợp chúng tơi chắn có lớp thành phần, bỏ qua giao diện IComponent có trang trí kế thừa trực tiếp Component Các trang trí Chúng ta thấy tạo trường hợp khác thẻ trang trí Chúng tơi xem xét việc có loại trang trí, chẳng hạn trang trí biên chí có trang trí mà làm cho hình ảnh ẩn Khơng có vấn đề trang trí, thứ có chứa thành phần đối tượng, mà trang trí, thiết lập chuỗi thay đổi (như đề xuất Hình 2-3) Một số thiết kế mẫu Decorator bao gồm giao diện IDecorator, thường khơng có mục đích thực C# Đa thao tác Minh họa tập trung vào việc vẽ hoạt động cho ảnh đồ trang trí Ví dụ khác vay mượn để nhiều thao tác tùy chọn Một số số phần thành phần ban đầu giao diện nó, số thêm vào hành vi trang trí định Client gọi hoạt động riêng lẻ thành phần (trang trí hay cách khác) mà có quyền truy cập Thực Tính quan trọng mẫu Decorator khơng dựa thừa kế để mở rộng hành vi Nếu lớp Tag phải kế thừa từ lớp hình ảnh để thêm hai phương thức, Tag mang tất thứ liên quan đến hình ảnh , làm cho chúng thành đối tượng nặng Thay vào đó, có lớp Tag thực giao diện hình ảnh sau thêm hành vi giữ đối tượng Tag tinh gọn Chúng có thể:  Thực phương thức giao diện, thay đổi hành vi ban đầu thành phần  Thêm trạng thái hành vi  Truy cập thành viên công cộng qua đối tượng thông qua phương thức khởi tạo Trước thực với hình ảnh ví dụ, xem xét phiên lý thuyết mẫu Decorator sau Ví dụ 2-1 Ví dụ ngắn hữu ích cho thấy tương tác lớp đối tượng mơ hình đồ trực tiếp đến UML Một chuyển sang ví dụ thực tế, tối ưu hóa phần mở rộng sử dụng làm cho khó khăn để phát định hình mẫu sử dụng Hơn nữa, ví dụ thực tế, tên yếu tố hồn tồn khác so với mơ tả mẫu Ví dụ 2-1 Đoạn code lý thuyết mẫu Decorator 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 using System; class DecoratorPattern { // Decorator Pattern Judith Bishop Dec 2006 // Shows two decorators and the output of various // combinations of the decorators on the basic component interface IComponent { string Operation(); } class Component : IComponent { public string Operation() { return "I am walking "; } } class DecoratorA : IComponent { IComponent component; public DecoratorA(IComponent c) { component = c; } } public string Operation() { string s = component.Operation(); s += "and listening to Classic FM "; return s; } class DecoratorB : IComponent { IComponent component; public string addedState = "past the Coffee Shop "; public DecoratorB(IComponent c) { component = c; } public string Operation() { string s = component.Operation(); s += "to school "; return s; } public string AddedBehavior() 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 { } return "and I bought a cappuccino "; } class Client { static void Display(string s, IComponent c) { Console.WriteLine(s + c.Operation()); } static void Main() { Console.WriteLine("Decorator Pattern\n"); IComponent component = new Component(); Display("1 Basic component: ", component); Display("2 A-decorated : ", new DecoratorA(component)); Display("3 B-decorated : ", new DecoratorB(component)); Display("4 B-A-decorated : ", new DecoratorB( new DecoratorA(component))); // Explicit DecoratorB DecoratorB b = new DecoratorB(new Component()); Display("5 A-B-decorated : ", new DecoratorA(b)); // Invoking its added state and added behavior Console.WriteLine("\t\t\t" + b.addedState + b.AddedBehavior()); } } } /* Output Decorator Pattern Basic component: I am walking A-decorated : I am walking and listening to Classic FM B-decorated : I am walking to school B-A-decorated : I am walking and listening to Classic FM to school A-B-decorated : I am walking to school and listening to Classic FM past the Coffee Shop and I bought a cappuccino */ Ví dụ bắt đầu với giao diện IComponent lớp Component đơn giản mà thực thi (dịng 9-21) Có hai trang trí thực thi giao diện, thứ số chúng bao gồm khai báo IComponent, đối tượng mà trang trí DecoratorA (dịng 23-39) đơn giản cần thực hoạt động cách gọi thành phần lưu trữ, sau thêm để chuỗi trả (dịng 35) DecoratorB (dịng 40-61) phức tạp Nó thực thi Operation theo cách riêng nó, cung cấp addedState (dịng 43) phương thức addedBehavior (dòng 57-61) public Trong hoạt động thực thi, phương thức Operation thành phần gọi đầu tiên, điều yêu cầu mẫu, đơn làm cho đầu dễ đọc ví dụ Lớp Client có trách nhiệm tạo thành phần trang trí cấu hình khác hiển thị kết phương thức Operation trường hợp Trường hợp (dịng 77-78) trang trí thành phần cách khác nhau, đầu dòng 92-93 Trường hợp áp dụng hai trang trí, B A, hai thứ tự khác Trong trường hợp 2-4, đối tượng trang trí thể sử dụng lập tức, sau bỏ Trong trường hợp 5, tạo đối tượng DecoratorB giữ trường hợp biến loại (thay IComponent), chúng tơi gọi hành vi mới: DecoratorB b = new DecoratorB(new Component( )); Display("5 A-B-decorated : ", new DecoratorA(b)); // Invoking its added state and added behavior Console.WriteLine("\t\t\t"+b.addedState + b.AddedBehavior( )); A-B-decorated : I am walking to school and listening to Classic FM past the Coffee Shop and I bought a cappuccino Có ba đối tượng đây: DecoratorA Component đối tượng khai báo rõ ràng khai báo b ngầm định Phương thức Display nhận đối tượng DecoratorA gọi phương thức Operation (dịng 68) Điều đưa tới đối tượng DecoratorB Trên dịng 52, đối tượng mà DecoratorB sử dụng với Operation gọi, chuỗi "I am walking" trả lại (dòng 19) Tiếp tục trên, DecoratorB thêm chút thông tin đến trường (dịng 53), sau DecoratorA cho biết thêm "nghe Classic FM" (dịng 35) Điều hồn thành gọi đến hiển thị Như nhìn thấy dòng 95, kết trái ngược với dịng 94 trang trí soạn theo thứ tự khác Tuy nhiên, khơng phải tất Trang trí xác định hành vi mới, gọi cách rõ ràng Chúng tơi làm điều dòng 85, mà kết dòng thứ hai đầu (dòng95) việc mua ly cà phê cappuccino Điều đó, tóm lại, cách trang trí làm việc Trang trí khơng cần tính ngơn ngữ cao cấp, chúng dựa vào đối tượng tổng hợp thực thi giao diện Bây giờ, xem xét ví dụ thực tế Ví dụ: Hình ảnh trang trí Trong phần này, xem xét làm để thực hệ thống trang trí hình ảnh, mơ tả phần "Minh họa", trước Nhấn mạnh thành phần ban đầu viết trước không khả dụng cho việc thay đổi, đặt khơng gian tên riêng biệt gọi Given: using System.Windows.Forms; namespace Given { // The original Photo class public class Photo : Form { Image image; public Photo ( ) { image = new Bitmap("jug.jpg"); this.Text = "Lemonade"; this.Paint += new PaintEventHandler(Drawer); } } public virtual void Drawer(Object source, PaintEventArgs e) { e.Graphics.DrawImage(image,30,20); } } Photo thừa kế từ System.Windows.Forms để hiển thị Constructor thiết lập phương thức Drawer mục tiêu PaintEventHandler gọi Form kích hoạt phương thức Main Trong C#, gọi đến Application.Run khởi động cửa sổ theo cách này, đó, client trông này: static void Main ( ) { // Application.Run acts as a simple client Application.Run(new Photo( )); } Bây giờ, mà không thay đổi điều lớp Photo, bắt đầu thêm trang trí Đầu tiên vẽ đường viền màu xanh xung quanh ảnh (chúng ta giả định kích thước biết để giữ cho thứ đơn giản): // This simple border decorator adds a colored border of fixed size class BorderedPhoto : Photo { Photo photo; Color color; public BorderedPhoto (Photo p, Color c) { photo = p; color=c; } public override void Drawer(Object source, PaintEventArgs e) { photo.Drawer(source, e); e.Graphics.DrawRectangle(new Pen(color, 10),25,15,215,225); } } Chú ý mã khơng giống mơ hình đặt hình 2-2, khơng có giao diện IComponent Điều hoàn toàn chấp nhận được, trang trí kế thừa trực tiếp từ thành phần trì đối tượng Chúng ta thấy mà Drawer hoạt động để gọi từ trang trí Tuy nhiên, mã dựa vào Component gốc khai báo Drawer phương thức ảo Nếu trường hợp đó, khơng thể vào thay đổi lớp Component, giao diện cần thiết Sự xếp thể ví dụ 2-1 Tag trang trí theo hình thức tương tự, đưa vào thành phần sau đây: // Compose a photo with two tags and a blue border foodTag = new Tag (photo, "Food", 1); colorTag = new Tag (foodTag, "Yellow", 2); ... c? ?ch mẫu Decorator đạt m? ?c tiêu Thao t? ?c addedBehavior thu? ?c tính addedState lớp Decorator c? ?ch tùy chọn kh? ?c vi? ?c mở rộng c? ? đối tượng Component ban đầu Chúng ta xem xét số ví dụ giây lát C? ?u... } class Component : IComponent { public string Operation() { return "I am walking "; } } class DecoratorA : IComponent { IComponent component; public DecoratorA(IComponent c) { component = c; ... bought a cappuccino "; } class Client { static void Display(string s, IComponent c) { Console.WriteLine(s + c. Operation()); } static void Main() { Console.WriteLine("Decorator Pattern\ n"); IComponent

Ngày đăng: 27/08/2017, 14:22

Xem thêm: C 3.0 Design Pattern Chương2

TỪ KHÓA LIÊN QUAN

w