Proxy

Khái niệm:

Cung cấp một đối tượng thay thế hoặc placeholder cho một đối tượng khác để truy xuất đến nó.

Mức độ sử dụng: khá cao

UML Class Diagram

proxy_class_diagram

Những lớp và/hoặc đối tượng trong mẫu thiết kế này:

Proxy (MathProxy):

     + bảo trì một tham chiếu để cho proxy truy xuất đối tượng thật. Proxy có thể nhắm vào một đối tượng nếu các interface RealSubject và Subject giống nhau.

     + cung cấp một interface giống hệt với interface của Subject để một proxy có thể được thay thế cho đối tượng thật.

     + điều khiển việc truy xuất đến đối tượng thật và có thể chịu trách nhiệm trong việc tạo ra và hủy nó.

     + những nhiệm vụ khác tùy thuộc vào loại proxy:

        * remote proxy: chịu trách nhiệm mã hóa một request và các đối số của nó và gửi các request được mã hóa cho đối tượng thật trong vùng địa chỉ khác.

        * virtual proxy: có thể bắt (cache) thông tin bổ sung về đối tượng thật để chúng có thể hoãn việc truy xuất nó. Ví dụ, ImageProxy trong Motivation bắt giới hạn của các hình ảnh thật.

        * protection proxy: kiểm tra “người gọi” có quyền truy xuất được yêu cầu để thực thi một request hay không.

Subject (IMath): định nghĩa interface chung cho Realsubject và Proxy để một Proxy có thể được sử dụng bất kì đâu mà một RealSubject được mong đợi.

RealSubject (Math): định nghĩa một đối tượng thật mà proxy mô tả.

Proxy: khi nào sử dụng và sử dụng ở đâu

Trong các ngôn ngữ hướng đối tượng, các đối tượng thực hiện công việc mà chúng được cho biết thông qua public interface của chúng. Những client của các đối tượng này mong muốn công việc này được thực hiện nhanh chóng và hiệu qủa. Tuy nhiên, có các tình huống nơi một đối tượng bị hạn chế và không thể tiếp tục thực hiện nhêệm vụ của nó. Thông thường, việc này xảy ra khi có một dependency trên một remote resource (một lời gọi đến máy tính khác chẳng hạn) hoặc khi một đối tượng mất nhiều thời gian để load. Trong những trường hợp tương tự như thế này, bạn chọn mẫu thiết kế Proxy và tạo một đối tượng proxy mà “đối tượng đóng thể” (stand-in) cho một đối tượng gốc. Proxy chuyển request đến đối tượng đích. Interface của đối tượng Proxy này giống như đối tượng gốc và các client không thể biết rằng họ đang xử lý với một proxy hơn là một đối tượng thật.

Có 3 mẫu proxy khác nhau:

+ Remote proxy: chịu trách nhiệm mã hóa một request và chuyển request được mã hóa cho một đối tượng thật trong một không gian địa chỉ khác (app domain, process hoặc machine).

+ Virtual proxy: có thể bắt thông tin bổ sung về một đối tượng thật để chúng có thể hoãn việc truy xuất nó (chẳng hạn như just-in-time loading, on-demand loading hoặc lazy loading).

+ Protection proxy: kiểm tra “người gọi” có các quyền truy xuất riêng để thực hiện request.

Thực tế, còn có kiểu proxy khác được gọi là Smart Reference. Một Smart Reference là một proxy cho một pointer, nhưng vì có ít ứng dụng cho các pointer trong .NET và bạn ít khi nào sử dụng loại proxy này.

Demo

ProxyRealWorldClassDiagram

http://cid-d0e5ddf023bf4324.office.live.com/embedicon.aspx/.Public/Design%20Pattern/ProxyRealWorld.zip

Flyweight

Khái niệm:

Sử dụng việc chia sẻ để hỗ trợ số lượng lớn các đối tượng fine-grained một cách hiệu quả.

Mức độ sử dụng: thấp

UML Class Diagram

flyweight_class_diagram

Những lớp và/hoặc đối tượng trong mẫu thiết kế này:

Flyweight (Character): khai báo một interface thông qua các flyweight có thể nhận và thực hiện trên trạng thái ngoại.

ConcreteFlyweight (CharacterA, CharacterB, …, CharacterZ): thực thi Flyweight interface và thêm vào phần lưu trữ cho trạng thái ngoại nếu có. Một đối tượng ConcreteFlyweight phải có khả năng chia sẻ được. Bất kì trạng thái nào mà nó lưu trữ phải là ngoại, nghĩa là nó phải độc lập với bối cảnh của đối tượng ConcreteFlyweight.

UnsharedConcreteFlyweight: không phải tất cả các lớp con đều cần được chia sẻ. Flyweight interface cho phép chia sẻ, nhưng nó không ép buộc.

Flyweight: khi nào dử dụng và sử dụng ở đâu

Mục tiêu của mẫu thiết kế Flyweight là để chia sẻ nhiều đối tượng fine-grained một cách hiệu quả. Các đối tượng flyweight được chia sẻ là bất biến, chúng không thể bị thay đổi vi chúng mô tả các tính chất được chia sẻ với các đối tượng khác. Một số ví dụ như các kí tự và line-style trong word processor hoặc các digit receiver trong một các ứng dụng mạng điện thoại chuyển đổi công cộng. Flyweight hiếm khi nào được sử dụng trong các ứng dụng nghiệp vụ hướng dữ liệu (data-driven business type application).

Demo

FlyweightRealWorldClassDiagram

http://cid-d0e5ddf023bf4324.office.live.com/embedicon.aspx/.Public/Design%20Pattern/FlyweightRealWorld.zip

Facade

Khái niệm:

Cung cấp một interface thống nhất cho một tập các interface trong một hệ thống con (subsystem). Façade định nghĩa một interface mức cao làm cho hệ thống con dễ dàng sử dụng hơn.

Mức độ sử dụng: cao

UML Class Diagram

facade_class_diagram

Những lớp và/hoặc đối tượng trong mẫu thiết kế này:

Façade (MortgageApplication):

     + biết các lớp của hệ thống con nào chịu trách nhiệm cho một request.

     + ủy thác các request của client để thích hợp với các đối tượng của hệ thống con.

Subsystem classes (Bank, Credit, Loan):

     + thực thi chức năng của hệ thống con

     + xử lý công việc được chỉ định bởi đối tượng façade

     + không biết về façade và không giữ tham chiếu đến nó

Façade: khi nào sử dụng và sử dụng ở đâu

Một façade là một lớp cung cấp một interface (một tập hợp các phương thức và thuộc tính) giúp client dễ sử dụng các lớp và đối tượng hơn trong một hệ thống con phức tạp. Mẫu thiết kế façade là một mẫu thiết kế đơn giản và có thể giống như là không đáng kể. Tuy vậy, ảnh hưởng của nó là rất đáng kể ví nó là một trong những mẫu thiết kế được sử dụng thường xuyên nhất trong các hệ thống được xây dựng trên mô hình 3-tier.

Mục đích của Façade là cung cấp một interface ở mức cao làm cho hệ thống con hoặc toolkit dễ sử dụng hơn cho client. Trong một ứng dụng 3-tier, presentation layer là client. Những lời gọi vào business layer thực hiện thông qua một service layer được định nghĩa tốt (well defined). service layer này, hoặc façade làm ẩn đi sự phức tạp của các đối tượng business và các tương tác của chúng.

Façade thường được sử dụng kết hợp với các mẫu thiết kế khác. bản thân các façade thường được thực thi như single abstract factories. Tuy nhiên, bạn có thể sử dụng các phương thức tĩnh trên Façade để có hiệu quả tương tự.

Demo

FacadeRealWorldClassDiagram

http://cid-d0e5ddf023bf4324.office.live.com/embedicon.aspx/.Public/Design%20Pattern/FacadeRealWorld.zip

Decorator

Khái niệm:

Gán bổ sung các “trách nhiệm” (responsibility) cho một đối tượng một cách linh hoạt. Các decorator cung cấp một sự lựa chọn linh động cho lớp con để mở rộng tính năng.

Mức độ sử dụng: vừa

UML Class Diagramdecorator_class_diagram

Những lớp và/hoặc đối tượng trong mẫu thiết kế này:

Component (LibraryItem): định nghĩa interface cho các đối tượng mà các “trách nhiệm” được thêm vào chúng một cách linh hoạt.

ConcreteComponent (Book, Video): xác định một đối tượng mà các “trách nhiệm” bổ sung có thể được gán vào.

Decorator (Decorator): bảo trì một tham chiếu đến một đối tượng Component và định nghĩa một interface phù hợp với interface của Component.

ConcreteDecorator (Borrowable): thêm các “trách nhiệm” vào component.

Decorator: khi nào sử dụng và sử dụng ở đâu

Động cơ của mẫu thiết kế Decorator là cho bạn mở rộng một hành vi của đối tượng một cách linh hoạt. Khả năng này là để gán hành vi mới một cách linh hoạt cho các đối tượng được thực hiện bới một lớp Decorator.

Mẫu thiết kế Decorator kết hợp tính đa hình với quyền ủy thác (delegation). Đó là tính đa hình với lớp gốc để cho các client có thể thực thi nó như lớp gốc. Trong hầu hết các trường hợp, những lời gọi phương thức được ủy thác cho lớp gốc và sau đó các kết quả được thực hiện bên trên, hoặc được decorate, với chức năng bổ sung. Decoration là một kỹ thuật linh hoạt vì nó thực hiện vào lúc runtime.

Demo

DecoratorRealWorldClassDiagram

http://cid-d0e5ddf023bf4324.office.live.com/embedicon.aspx/.Public/Design%20Pattern/DecoratorRealWorld.zip

Composite

Khái niệm:

Các đối tượng cấu thành các cấu trúc cây để mô tả bán toàn bộ hệ thống phần cấp. Composite để cho các client tác động các đối tượng riêng biệt và các thành phần của đối tượng một cách thống nhất

Mức độ sử dụng: khá cao

UML Class Diagram

composite_class_diagram

Những lớp và/hoặc đối tượng trong mẫu thiết kế này:

Component (DrawingElement):

     + khai báo interface cho các đối tượng trong thành phần.

     + thực thi hành vi mặc định cho interface chung cho tất cả các lớp tương ứng.

     + khai báo một interface để truy xuất và quản lý các thành phần con của nó.

     + (tùy chọn) định nghĩa một interface để truy xuất một thành phần cha của thành phần hiện tại trong cấu trúc đệ quy và thực thi nó nếu thích hợp.

Leaf (PrimitiveElement):

     + mô tả các đối tượng “lá” trong thành phần. Một “lá” không có lá con.

     + định nghĩa hành vi cho các đối tượng nguyên thủy trong thành phần.

Composite (CompositeElement):

     + định nghĩa hành vi cho các thành phần có phần con.

     + lưu trữ các thành phần con.

     + thực thi các hoạt động liên qua đến phần con trong Component interface

Client (CompositeApp): tính toán các đối tượng trong thành phần thông qua Component interface.

Composite: khi nào dử dụng và sử dụng ở đâu

Mẫu thiết kế Composite là một cấu trúc dữ liệu trong bộ nhớ (in-memory data structures) với các nhóm các đối tượng, mỗi nhóm bao gồm nhiều item riêng biệt hoặc các nhóm khác.Ví dụ cho việc sử dụng mẫu thiết kế Composite là Tree control. Các nút của cây bao gồm một đối tượng cá biệt (nút lá) hoặc một nhóm các đối tượng (một cây con các nút). Tất cả các nút trong mẫu thiết kế Composite chia sẻ một interface dùng chung hỗ trợ các item riêng biệt cũng như các nhóm các item. iterface dùng chung này tạo điều kiện rất tốt cho việc thiết kế và xây dựng các thuật toán đệ quy lặp lại trên từng nút trong tập hợp Composite.

Về cơ bản, mẫu thiết kế Composite là một tập hợp mà bạn có thể sử dụng để xây dựng các cây và các đồ thị có hướng. Nó được dùng như bất kì tập hợp nào khác như mảng (array), danh sách (list), ngăn xếp (stack), từ điển (dictionary)…

Demo

CompositeRealWorldClassDiagram

http://cid-d0e5ddf023bf4324.office.live.com/embedicon.aspx/.Public/Design%20Pattern/CompositeRealWorld.zip

Bridge

Khái niệm:

Tách một abstraction khỏi implementation của nó để cả hai có thể thay đổi độc lập nhau.

Mức độ sử dụng: vừa

UML Class Diagram:

bridge_class_diagram

Những lớp và/hoặc đối tượng trong mẫu thiết kế này:

Abstraction (BusinessObject):

     + định nghĩa interface của abstraction

     + bảo trì một tham chiếu đến một đối tượng của Implementor

RefinedAbstraction (CustomersBusinessObject): mở rộng interface được định nghĩa bởi Abstraction.

Implementor (DataObject): định nghĩa interface cho các lớp implementation. interface này không phải tương xứng tuyệt đối với interface của Abstraction; thực sự, 2 interface này có thể khác nhau hoàn toàn. interface implementation chỉ cung cấp các hoạt động ban đầu và Abstraction định nghĩa các hoạt động mức cao hơn dựa trên những hoạt động này.

ConcreteImplementor (CustomersDataObject): thực thi interface của Implementor và định nghĩa implementation tương ứng của nó.

Bridge: khi nào dử dụng và sử dụng ở đâu

Mẫu thiết kế Bridge được sử dụng để tách một abstraction khỏi implementation của nó để cả hai có thể thay đổi đôc lập nhau. Bridge là một trong những mẫu thiết kế cấu trúc mức cao và mục tiêu chính của nó là thông qua abstraction giúp cho các lập trình viên .NET viết code tốt hơn. Một mẫu thiết kế Bridge được tạo ra bằng cách di chuyển một tập các abstract operation sang một interface để cả client và dịch vụ có thể thay đổi mà không phụ thuộc lẫn nhau.

Một ví dụ kinh điển của mẫu thiết kế Bridge là khi code với các trình điều khiển thiết bị (device driver). Một driver là một đối tượng hoạt động đôc lập với một hệ thống máy tính hoặc thiết bị phần cứng bên ngoài. Việc nhận biết các ứng dụng client là abstraction rất là quan trọng. Điều thú vị là mỗi đối tượng driver là một implementation của mẫu thiết kế Adapter. Trong toàn hệ thống, ứng dụng cùng với các driver mô tả cho một đối tượng của Bridge.

Demo

BridgeRealWorldClassDiagram

http://cid-d0e5ddf023bf4324.office.live.com/embedicon.aspx/.Public/Design%20Pattern/BridgeRealWorld.zip

Adapter

Khái niệm:

Chuyển interface của một lớp thành interface khác mà các client mong muốn. Adapter để cho các lớp làm việc với nhau có thể không bới vì các interface không tương thích.

Mức độ sử dụng: vừa

UML Class Diagram:

adapter_class_diagram

Những lớp và/hoặc đối tượng trong mẫu thiết kế này:

Target (ChemicalCompound): định nghĩa một domain-specific interface mà Client sử dụng.

Adapter (Compound): làm cho Adaptee interface tương thích với Target interface.

Adaptee (ChemicalDatabank): xác định một interface đang tồn tại cần làm tương thích.

Client (AdapterApp): phối hợp các đối tượng phù hợp cho Target interface.

Adapter: khi nào dùng và dùng ở đâu

Các lập trình viên .NET viết các lớp đưa ra các phương thức được gọi bởi các client. Hầu hết thời gian chúng có thể điều khiển các interface, nhưng có một số trường hợp, chẳng hạn khi dùng các thư viên của hãng thứ 3, nơi chúng không thể làm được điều đó. Thư viện của hãng thứ 3 thực thi các dịch vụ được mong đợi nhưng các phương thức của interface và các tên của thuộc tính khác biệt so với những gì client mong đợi. Đây là một trường hợp mà bạn cần sử dụng mẫu thiết kế Adapter. Adapter cung cấp một interface mà client mong đợi sử dụng những dịch vụ của một lớp với một interface khác. Các adapter thường được sử dụng trong các môi trường lập trình nơi mà các thành phần hoặc các ứng dụng mới cần được tích hợp và làm việc với nhau với các thành phần đang tồn tại.

Các adapter cũng hữu ích trong các trường hợp refactor. Giả sử bạn có 2 lớp thực thi các chức năng khác nhau nhưng có các interface khác nhau. Client sử dụng cả 2 lớp này, nhưng phần code thì sẽ không thật rõ ràng và đơn giản hơn để hiểu nếu chúng cùng chia sẻ một interface. Bạn không thể thay thế interface này, nhưng bạn có thể “che” những khác biệt này bằng cách sử dụng Adapter cho phép client kết nối thông qua một interface chung. Adapter này xử lý việc ánh xạ giữa interface được chia sẻ và các interface gốc.

Demo

AdapterRealWorldClassDiagram

http://cid-d0e5ddf023bf4324.office.live.com/embedicon.aspx/.Public/Design%20Pattern/AdapterRealWorld.zip