Chương 1 LỜi nóI ĐẦU



tải về 396.06 Kb.
trang5/7
Chuyển đổi dữ liệu02.09.2016
Kích396.06 Kb.
#31264
1   2   3   4   5   6   7

3.2.3. Singleton

3.2.3.1. Mục đích


Đảm bảo một lớp chỉ có một thể hiện, và cung cấp điểm toàn cục trong việc truy cập vào nó.

3.2.3.2. Ví dụ


Làm thế nào để đảm bảo rằng một lớp chỉ có thể có một thể hiện và thể hiện đó có thể truy xuất dễ dàng? Một biến toàn cục làm cho một đối tượng có thể được truy xuất tại mọi nơi, nhưng không đảm bảo cho việc tạo ra nhiều thể hiện của lớp đó.

Giải pháp tốt nhất là bản thân lớp đú cú nhiệm vụ theo dõi thể hiện duy nhất của nó. Lớp đó có thể đảm bảo rằng không có thể hiện nào khác có thể được tạo ra, và nó có thể cung cấp cách truy xuất đến thể hiện. Dạng mẫu này được gọi là mẫu Singleton.


3.2.3.3. Ứng dụng


Phải cú đỳng một thể hiện của lớp, và nó phải được truy cập tới clien tử điểm truy cập đã xác định rõ ràng.

Khi một thể hiện duy nhất có thể mở rộng bằng cách tạo lớp con và các client của nó phải dùng một thể hiện mở rộng mà không cần sửa đổi lại mã của chúng.


3.2.3.4. Cấu trúc





3.2.3.5. Thành phần


Singleton: Xác định một thao tác Instance mà cho phép các client truy cập vào trong một thể hiện duy nhất. Instance là một lớp thao tác

Có chức năng để tạo một thể hiện duy nhất.


3.2.3.6. Cộng tác:


Các client truy cập một Singleton một cách duy nhất thông qua hàm Instance của Singleton.

3.2.3.7. Kết quả :


Điều khiển truy cập tới một trường hợp duy nhất Vì lớp Singleton bao gói thể hiện duy nhất của nó. Nờn nó có thể có giới hạn điều khiển việc các client truy xuất đến nó như thế nào và khi nào.

Giảm thiểu không gian tên.( được cải thiện dựa trên các biến toàn cục, Nó tránh được trùng lặp về không gian tên với các biến toàn cục mà lưu trong trường hợp đơn nhất.).

Cho phép cải tiến và làm mịn các thao tác và biểu diễn. Do lớp Singleton có thể tạo ra các lớp con của nó, nó dễ được định dạng một ứng dụng với một thể hiện của lớp được mở rộng này. Bạn có thể định dạng một ứng dụng với thể hiện của lớp bạn cần tại thời gian chạy.

Cho phép số lượng biến của các thể hiện, tức là cho phép tạo ra một số lượng có thể thay đổi các thể hiện.

Thuận tiện hơn các thao tác lớp, tạo sự mềm dẻo khi thao tác với các lớp, Không nhất thiết là tạo ra thể hiện duy nhất. Mẫu Singleton cho phép tạo nhiều hơn một thể hiện, hơn nữa với hướng tiếp cận như vậy có thể điều khiển được số lượng thể hiện mà ứng dụng sử dụng. Chỉ mỗi hàm cho phép truy xuất đến thể hiện của Singleton là phải thay đổi.

3.2.3.8. Cài đặt


Đảm bảo một trường hợp duy nhất. Cách chung nhất để thực hiện điều này là ẩn đi hàm tạo và thể hiện dưới dạng một hàm của lớp( hoặc là một chức năng tĩnh hoặc một class method). Điều đó đảm bảo chỉ một duy nhất một thể hiện được tạo ra, hàm đó truy xuất đến biến có thể hiện duy nhất và nó chắc chắn rằng biến đó được khởi tạo với thể hiện duy nhất truúc khi trả về giá trị của nó.

Lớp Singleton được khai báo như sau:

class Singleton {

public:


static Singleton* Instance():

protect:


Singleton();

private:


static Singleton* _instance;

};

Chức năng của việc cài đặt trong này là:



Singleton*Singleton:_ instance = 0;

Singleton* Singleton:: Instance(){

if (_instance == 0) {

_instance = new Singleton;

}

return _ instance;



}

Từ đoạn mã cài đặt và chức năng của lớp Singleton, đã nêu rõ được kết quả khi áp dụng mẫu Singleton vào trong thiết kế. Nó kiểm soát được truy xuất tới trường hợp duy nhất và giảm thiểu không gian tên, cũng như cho phép số lượng biến mà nó thể hiện.

Phân lớp con trong lớp Singleton.

3.2.3.9. Các mẫu liên quan


Một số mẫu có thể được thực hiện bằng việc sử dụng Singleton mẫu. (Abstract factory, Builder, và Prototype).

Kết luận: Như vậy có hai cách để tham số hoá hệ thống bởi các lớp đối tượng nó tạo ra. Cách một là sắp xếp các lớp tạo đối tượng, việc này cho phép sử dụng mẫu Factory Method. Mặt hạn chế chính của bước này là nó có thể yêu cầu tạo một lớp con mới để thay đổi lớp của sản phẩm. Sự thay đổi này có thể là trường hợp thay thế.

Một mặt khác để tham số hoá hệ thống là dựa trên nhiều thành phần kết cấu đối tượng. Xác định một đối tượng chức năng đối với việc nhận biết lớp của sản phẩm đối tượng, và nó làm cho nó tham số hoá hệ thống. Đây là khía cạnh chủ yếu của Abstract Factory, Builder và Prototype. Ba mẫus này liên quan đến việc tạo một đối tượng factory mới mà tính năng của nó là để tạo ra các đối tượng sản phẩm. Abstract Factory có đối tượng factory tạo đối tượng thuộc một số lớp.

Trong khung soạn thảo, Factory method là cách dễ nhất để sử dụng đầu tiên. Nó rất dễ để xác định một lớp con mới.

3.2.4. Các mẫu cấu trỳc(Structural Mẫu)


Các mẫu cấu trúc được quan tâm về các lớp và các đối tượng như thế nào để hợp thành một cấu trúc lớn hơn. Các mẫu lớp cấu trúc đều dùng tớnh kế thừa để tạo giao diện hoặc thực hiện. Structural đối tượng mô tả các phương pháp để tạo các đối tượng thu được nhiều chức năng mới. Giữa các mẫu cấu trúc cú cỏc thành phần giống nhau, đặc biệt là thành phần tham gia và cộng tác của chúng. Điều này là có thể vỡ cỏc mẫu cấu trúc dựa trên một bộ nhỏ giống nhau của các cơ chế ngôn ngữ về mã cấu trúc và sự vật.

Có thể chia chúng thành 2 loại:

Structural class pattern: Sử dụng tính kế thừa để tạo các giao diện hay các thực hiện: ví dụ, ta thừa kế trộn 2 hay nhiều lớp thành một lớp. Lớp tạo ra chứa tất cả các thuộc tính của các lớp cha của nó.

Structural object pattern: là phương pháp để hợp các đối tượng để thực hiện chức năng mới.

Trong các mẫu cấu trúc cú cỏc mẫu mà tụi đó nghiên cứu sau:


  • Adapter mẫu

  • Bridge mẫu

  • Composite mẫu

  • Decorator mẫu

  • Facade mẫu

  • Flyweight mẫu

  • Proxy mẫu

3.2.4.1. Adapter mẫu

3.2.4.1.1 Mục đích

Chuyển đổi giao diện của một lớp sang giao diện khác mà client muốn.

Cho phép các lớp có giao diện không tương thích làm việc với nhau.
3.2.4.1.2 Ví dụ:

Một soạn thảo đồ hoạ, giúp người dùng có thể vẽ hoặc sắp xếp các thành phần đồ hoạ như là đường thẳng, text, đa giác... vào các tranh vẽ hoặc các biểu đồ. Vấn đề trừu tượng chính của soạn thảo vẽ ở đây là đối tượng đồ hoạ, hình dáng có thể tự sửa đổi được. Giao diện cho các vấn đề đồ hoạ ở đây được định nghĩa bởi một lớp trừu tượng gọi là Shape. Soạn thảo vẽ định nghĩa một lớp con của Shape cho từng loại như LineShape cho đường kẻ, PolygonShape cho đa giác...

Các lớp ứng với các hình dáng hình hoạ cơ bản như LineShape, PolygonShape là đơn giản hơn trong việc cài đặt vì cỏc khả năng vẽ và sửa đổi của chúng là hạn chế. Nhưng một lớp con TextShape cho phép hiển thị và sửa đổi text rất khó cài đặt, do việc sửa đổi text đến cỏc phộp cập nhật màn hình quản lý bộ đệm phức tạp.

Trong khi đó, bộ dụng cụ trong giao diện người dùng cung cấp lớp TextView cho hiển thị và soạn thảo. Ở đây ta muốn sử dụng lại TextView để thực hiện TextShape, nhưng dụng cụ không được thiết kế với Shape nên không thể sử dụng đối tượng TextView và TextShape một cách tích hợp.

Như vậy yêu cầu ở đây đặt ra là làm thế nào để các lớp sẵn có và không liên quan như TextView và TextShape có thể làm việc với nhau trong khi giao diện không tương thích với nhau.

Một giải pháp đặt ra là có thể thay đổi lớp TextView để cho nó phù hợp với giao diện Shape, nhưng sẽ không thực hiện nếu không có mã nguồn trong bộ dụng cụ. Chính vì thế, thay vì định nghĩa TextShape để thích ứng với giao diện TextView với giao diện Shape. Chúng ta có thể định nghĩa điều này theo 2 cách: bằng cách kế thừa giao diện Shape và thực hiện TextView hoặc kết nối thể hiện TextView vào một TextShape và cài đặt TextShape dưới dạng giao diện của TextView. Cả hai phương pháp này tương ứng với hai phiên bản của mẫu Adapter: class Adapter pattern, và Object Adapter Pattern.

3.2.4.1.3 Ứng dụng

Muốn sử dụng một lớp hiện hành và giao diện của nó nhưng không phù hợp với cái bạn cần.

Muốn tạo một lớp sử dụng lại mà các kết nối với các lớp không liên quan, không biết trước, nghĩa là các lớp không cần phải có giao diện tương thích.

Cần sử dụng một số các lớp con hiện hành, nhưng nó được ứng dụng trong thực tế để điều hợp giao diện của chúng bằng việc phân lớp. Một đối tượng Adapter có thể điều hợp giao diện của lớp cha.

3.2.4.1.4 Cấu trúc:

Phương pháp I: Một lớp adapter sử dụng tính kế thừa để thớc ứng một giao diện tới giao diện khác.

Một đối tượng adapter dựa trên tổ hợp đối tượng.






3.2.4.1.5 Thành phần:

Target : định nghĩa giao diện domain-specific mà Client sử dụng.

Client : Cộng tác với cỏc đối tượng tuân theo giao diện Target .

Adaptee : Định nghĩa một giao diện có sẵn cần thiết cho việc thích nghi.

Adapter:Giao diện này cần phải sửa đổi cho phù hợp với giao diện Target.


3.2.4.1.6 Các cộng tác

Client gọi các lệnh trong thể hiện Adapter. Từ đó, adapter gọi các lệnh Adaptee để thực hiện yêu cầu.
3.2.4.1.7 Kết quả.

Class Adapter và object Adapter có nhiều yếu tố để đánh giá khác nhau để đạt được hiệu quả tốt nhất. Việc làm cho Adapter tương thích với Target được làm cho một lớp cụ thể. Dẫn đến, một lớp adapter sẽ không hoạt động khi chúng ta muốn điều hợp một lớp và các lớp con của nó.

Điều hợp Adapter tới Target bằng cách chuyển đến lớp Adapter cụ thể.

Cho phép Adapter ghi đè một số hoạt động của Adapter, từ khi Adapter là một lớp con của Adaptee.

Giới thiệu duy nhất một đối tượng, và không cần điểm gián tiếp nào để nhận đến adaptee.

Một đối tượng adapter:

Cho phép một adapter làm việc với nhiều adaptee.

Làm cho khó ghi đố các hàm của Adaptee hơn, nó yêu cầu tạo lớp con Adaptee và bắt Adapter tham chiếu đến lớp con chứ không phải là bản thân Adaptee.

Một số vấn đề khi sử dụng Adapter mẫu:

Adapter biến đổi trong một lượng công việc chúng thực hiện để tương thích Adatee tới giao diện Target. Adapter là không trong suốt với client.

3.2.4.1.8 Cài đặt.

Cài đặt lớp Adater trong C++ : Adapter có thể kế thừa chung từ Target và riêng từ Adaptee. Do đó Adapter là một dạng con thuộc Target chứ không thuộc Adaptee.

Sử dụng các thao tác trừu tượng.

Sử dụng các đối tượng thành phần.

Các Adapter đã được tham số hoá.


3.2.4.1.9 Các mẫu liên quan:

Bridge có cấu trúc tương tự như một đối tượng adapter, nhưng Bridge có nội dung khỏc: Nó được hiểu là để phân chia một giao diện từ việc thực hiện của nó nên có thể biến đổi rõ ràng và độc lập. Một adapter được hiểu là để thay đổi một giao diện của đối tượng sẵn có.

Decorator tăng cường đối tượng khác mà không cần thay đổi giao diện của nó. Một Decorator vì thế sẽ trong suốt hơn đối với ứng dụng hơn là một adapter. Từ đó đưa ra kết quả, Decorator hỗ trợ các thành phần đệ quy, mà nó không có hỗ trợ cho một adapter trong suốt.

Proxy định nghĩa một biểu diễn hoặc thay thế cho đối tượng khác và không thay đổi giao diện của nó.

3.2.4.2. Bridge mẫu

3.2.4.2.1 Mục đích

Phân tách việc trừu tượng hoá khỏi các cài đặt của chúng để cho cả hai có thể biến đổi một cách độc lập.
3.2.4.2.2 Ví dụ

Việc cài đặt của vấn đề trừu tượng hoá trong cửa sổ Window trong bộ dụng cụ giao diện người dùng, cho phép các user có thể ghi các ứng dụng làm việc trong cả hai hệ thống X Window System và Presentation Manager. Sử dụng tính kế thừa, chúng ta định nghĩa một lớp Window, các lớp con XWindow và PMWindow cài đặt giao diện Window cho các nền khác nhau.

Nhưng chính phương pháp này có hai điều hạn chế lớn nhất, đó là:



    • Không thuận tiện khi mở rộng Window để bao hàm các dạng khác của window hoặc các nền mới. Tưởng tượng là một lớp con IconWindow của Window chỉ ra bởi các icon trong Window. Để hỗ trợ Icon Window cho cả hai nền này, chúng ta cài đặt 2 lớp mới, XIconWindow và PMIconWindow. Trong trường hợp xấu nhất, chúng ta sẽ định nghĩa 2 lớp cho mọi cửa sổ. Như vậy cần một nền thứ 3 yêu cầu lớp con Window mới cho tất cả các dạng cửa sổ.

    • Làm cho mã nguồn Client độc lập với nền. Bất kỳ khi nào client tạo một cửa sổ, nó khỏi tạo một lớp thực hiện, mà nó chỉ ra cài đặt. Trong trường hợp này, ạo một đối tượng XWindow kết nối với Window cho việc cài đặt X Window, tạo mã nguồn client độc lập với cài đặt X Window, chính vì thế, nó rất khó để chuyển mã nguồn client tới các nền khác.

Khi áp dụng mẫu Bridge, nó lập địa chỉ những vấn đề này bằng cách đặt Window và cài đặt của nó trong biểu đồ lớp phân chia. Chỉ có một lớp kế thừa cho các cửa sổ giao diện (Window, IconWindow, TransientWindow) và biểu đồ lớp phân chia cho các cài đặt cửa sổ chỉ ra nền, coi WindowImp là gốc. Lớp con XWindowImp cung cấp một cài đặt dựa trên X Window System.

Tất cả các lớp con Window được cài đặt trong các thao tác ảo từ giao diện WindowImp. Điều này tách riêng các cửa sổ khỏi các cài đặt. Mối quan hệ giã Window và WindowImp như một cầu nối, do nó bắc cầu giữa vấn đề trừu tượng này và việc cài đặt của nó, cho phép chúng biến đổi một cách độc lập.


3.2.4.2.3 Ứng dụng

Cần tránh một kết nối cố định giữa vấn đề ảo và việc cài đặt của nó.

Cả vấn đề ảo và việc cài đặt của nó có thể mở rộng việc phân lớp con. Trong trường hợp này Bridge cho phép bạo tổ hợp các vấn đề ảo và các cài đặt khác nhau và mở rộng chúng một cách độc lập.

Thay đổi cài đặt của một vấn đề ảo có thể không ảnh hưởng đến client; có nghĩa là mã của chúng không cần phải dịch lại.

Muốn ẩn việc thực hiện của vấn đề ảo hoàn toàn từ các client.

Muốn dùng chung cài đặt giữa nhiều đối tượng, và điều này có thể được ẩn từ client.

3.2.4.2.4 Cấu trúc:




3.2.4.2.5 Thành phần:

    • Abstraction:

      • Định nghĩa một giao diện trừu tượng.

      • Duy trì một tham chiếu tới một đối tượng của dạng Implementor.

    • RefinedAbstraction :

  • Mở rộng một giao diện được định nghĩa bởi Abstraction.

    • Implementor:

      • Định nghĩa một giao diện để cài đặt các lớp. Giao diện này không cần phải thực hiện một cách chính xác tới giao diện của Abstraction; thực tế hai giao diện có quá nhiều điểm khác nhau. Điển hình giao diện Implementor cung cấp các thao tác cơ bản, và Abstraction định nghĩa các thao tác mức cao dựa trên những ưu tiên này.

    • ConcretImplementor:

      • Thực hiện giao diện Implementor và định nghĩa cài đặt cụ thể. của nó.
3.2.4.2.6 Kết quả

Phân tách giao diện và cài đặt. Do việc thực hiện của vấn đề ảo có thể được định dạng tại thời gian chạy. Phân tách được Abstraction và Implementation cũng loại bỏ được sự phụ thuộc của thời gian biên dịch vào cài đặt, thay đổi việc cài đặt lớp không yêu cầu phải biên dịch lại

lớp Abstraction và các client của nó.

Khả năng mở rộng được cải thiện. Có thể mở rộng biểu đồ Abstraction và Implementation một cách độc lập.

Ẩn đi các chi tiết cài đặt từ Client.


3.2.4.2.7 Cài đặt

Trong quá trình thực hiện khi áp dụng Bridge mẫu vào, sẽ phát sinh một số vấn đề sau :

Chỉ có một Implementor.

Tạo đúng đối tượng Implementation

Sử dụng chung Implementor.

Sử dụng tính đa kế thừa.

3.2.4.2.8 Các mẫu liên quan

Abstract Factory có thể tạo và cấu hình một phần Bridge.

Adapter mẫu lớn hơn toward việc tạo các lớp không phụ thuộc làm việc cùng nhau. Nó thường được áp dụng vào hệ thống sau khi chỳng đó được thiết kế. Bridge, trong một khía cạnh nào đó, được sử dụng up-front trong thiết kế để cho phộp cỏc trừu tượng hoá và việc cài đặt biến đổi một cách độc lập.


3.2.4.3. Composite

3.2.4.3.1 Mục đích

Tạo nên một cách tổng thể các đối tượng thành cấu trúc cây để biểu diễn các hệ thống part-whole. Composite cho phép các client sử dụng các đối tượng và các thành phần riêng lẻ của các đối tượng thống nhất.
3.2.4.3.2 Ví dụ

Ứng dụng đồ hoạ như soạn thảo vẽ và hệ thống biểu diễn dưới dạng bản đồ cho phép người dùng xây dựng một biểu đồ phức tạp từ những thành phần đơn giản. Người dùng có thể nhúm cỏc thành phần để tổ chức thành thành phần lớn hơn. Một cách thực hiện đơn giản là có thể định nghĩa các lớp cho các mẫu đồ hoạ như Text, Line, và các lớp cú cỏc hoạt động này.

Khi sử dụng phương pháp này, sẽ xuất hiện một vấn đề: Mã nguồn mà sử dụng các lớp này phải xử lý được màu gốc và các đối tượng trong nội dung đó một cách khác nhau. Để phân biệt những đối tượng này sẽ làm cho hệ thống phức tạp hơn. Mẫu Composite mô tả làm thế nào để sử dụng thành phần đệ quy nờn cỏc client không cần phải tạo sự khác biệt đó.

Nhưng vấn đề chủ yếu ở đây là: một lớp ảo biểu diễn cả gốc và nội dung của nó. Đối với hệ thống đồ hoạ, lớp này là Graphic, Graphic khai báo các thao tác Draw, dùng để chỉ ra các đối tượng đồ hoạ. Nó cũng khai báo các thao tác mà tất cả các thành phần của nó sử dụng chung, ví dụ như thao tác truy xuất và quản lớ cỏc lỏ con của nó.

Các lớp con như là Line, Rectangle, và Text, định nghĩa các đối tượng đồ hoạ cơ bản. Những lớp này cài đặt thao tỏcDraw để vẽ các đường, hình chữ nhật, và dạng text, từ đó các đối tượng đồ hoạ cơ bản không có các đồ hoạ con, không có lớp con nào trong số đó cài đặt các thao tác con- quan hệ.

Do lớp Picture định nghĩa một kết tập với đối tượng Graphic, nên Picture cài đặt Draw để gọi Draw trong các con của nó, và nó cài đặt các thao tác con-quan hệ. Do giao diện Picture tương thích với với giao diện Graphic, đối tượng Picture có thể tổ hợp các đệ quy Picture khác.




3.2.4.3.3 Ứng dụng

Muốn biểu diễn các biểu đồ part-whole của các đối tượng.

Muốn client có thể bỏ qua sự khác nhau giữa các composition của các đối tượng và đối tượng riêng lẻ. Client sẽ vận dụng tất cả các đối tượng trong cấu trúc thành phần một cách đồng bộ.


3.2.4.3.4 Cấu trúc:

Các đối tượng typically Composite có thể được quan sát dưới dạng:






3.2.4.3.5 Thành phần

    • Component:

      • Khai báo một giao diện cho các đối tượng trong composition

      • Cài đặt mặc định hàm cho giao diện chung tới tất cả các lớp con của nó.

      • Khai báo một giao diện cho việc truy xuất và quản lớ cỏc thành phần con của nó.

      • Định nghĩa một giao diện cho việc truy xuất một thành phần cha trong cấu trúc đệ quy, và cài đặt nó nếu nó thích hợp.

    • Leaf:

  • Biểu diễn các đối tượng lá trong thành phần. Một lá không có con nào.

  • định nghĩa hoạt động của các đối tượng ưu tiên trong thành phần.

    • Composite

  • Định nghĩa hoạt động cho các thành phần chứa các lớp con.

  • Lưu các thành phần con.

  • Cài đặt các thao tác con-quan hệ trong giao diện Component.

    • Client.

  • vận dụng các đối tượng vào thành phần thông qua giao diện Component.
3.2.4.3.6 Kết quả.

Định nghĩa các biểu đồ lớp bao hàm cả các đối tượng ưu tiên và các đối tượng thành phần. Đối tượng ưu tiên có thể được kết cấu vào nhiều đối tượng phức tạp. Bất cứ khi nào mã client muốn một đối tượng ưu tiên, nó cũng có thể sử dụng đối tượng thành phần.

Tạo client đơn giản. Client có thể xử lý các cấu trúc thành phần và các đối tượng riêng lẻ một cách không đồng bộ.

Dễ dàng thêm vào các dạng mới của các thành phần.

Có thể làm cho thiết kế tổng quát hơn.


3.2.4.3.7 Phối hợp cộng tác

Các client sử dụng giao diện lớp Component để tương thích với các đối tượng trong cấu trúc thành phần. Nếu nơi nhận là nút Leaf, thỡ cỏc yêu cầu được nắm giữ một cách trực tiếp. Nếu nơi nhận là Composite, thỡ cỏc yêu cầu thường được gửi tới các thành phần con của nó, các thao tác thêm vào trước hoặc sau khi gửi tới và xử lý.
3.2.4.3.8 Cài đặt

Đưa ra tham chiếu cha : Duy trì các tham chiếu từ các thành phần con tới cha của chúng có thể làm đơn giản hoá việc thực hiện và quản lí của cấu trúc thành phần.

Chia sẻ thành phần : Sử dụng chung các thành phần thường có lợi hơn

Tối đa hoá giao diện Component.

Khai báo các thao tác quản lí con : Mặc dù lớp Composite thực hiện các thao tác Add và Remove đối với con, một vấn đề quan trọng trong Composite là những lớp nào khai báo những thao tác này trong biểu đồ lớp Composite. Một quyết định bao hàm sự cân bằng giữa độ an toàn và trong suốt là định nghĩa giao diện quản lí con tại gốc của biểu đồ lớp, đồng thời trong suốt đối với bạn.

Component có thể thực hiện được một danh sách các thành phần không?

Nắm giữ để cải thiện việc cài đặt

Ai có thể xoỏ cỏc thành phần.

Đâu là cấu trúc dữ liệu tốt nhất cho việc lưu trữ Component ?.


3.2.4.3.9 Các mẫu liên quan:

Thông thường kết nối thành phần – cha được dùng cho Chain of Responsibility.Decorator thường được dùng với Composite. Khi các decorator và composite được sử dụng cùng nhau, chúng sẽ có lớp nút cha chung. Nờn cỏc decorator sẽ phải hỗ trợ giao diện Component với các thao tác như là Add, Remove, GetChild.Flyweight cho phép bạn sử dụng các thành phần, nhưng chúng không yêu cầu xa hơn đến các cha của chỳng.Iterator có thể được sử dụng để chuyển đổi thành phần. Visitor khoanh vùng các thao tác và hoạt động có thể phân phối tới các lớp Composite và Leaf.

3.2.4.4. Decorator

3.2.4.4.1 Mục đích

Gắn các chức năng thêm có thể thêm vào một đối tượng một cách động. Decorator cung cấp một lựa chọn hiệu quả để phân lớp cho việc mở rộng chức năng.
3.2.4.4.2 Ứng dụng

Thờm các chức năng tới các đối tượng riêng lẻ một cách động và trong suốt, không cần ảnh hưởng tới các đối tượng khác.

Sử dụng Decorator đối với các nhiệm vụ mà có thể được rút lại.

Sử dụng Decorator khi việc mở rộng bằng phân lớp là không thực tế. Thỉnh thoảng một số lớn các mở rộng độc lập là có thể và tạo ra một phát triển nhanh của các lớp con để hỗ trợ mọi kết nối. Hoặc một định nghĩa lớp có thể được ẩn đi hoặc nếu không không có giá trị với việc phân lớp.

3.2.4.4.3 Cấu trúc:




3.2.4.4.4 Thành phần:

Component:

Định nghĩa một giao diện cho các đối tượng mà có chức năng được thêm vào chúng một cách động.

ConcreteComponent

Định nghĩa một đối tượng mà các chức năng có thể được gắn lại

Decorator

Duy trì một tham chiếu tới đối tượng Component và định nghĩa một giao diện mà phù hợp với giao diện Component.

ConcreteDecorator

Thêm vào các chức năng tới các thành phần.


3.2.4.4.5 Phối hợp cộng tác.

Decorator hướng các yêu cầu tới đối tượng Component của chúng. Nó có thể mang tính lựa chọn để thực hiện các thao tác thêm vào trước và sau khi hướng tới các yêu cầu.
3.2.4.4.6 Kết quả.

Hiệu quả hơn đối với kế thừa tĩnh.

Trỏnh các lớp mức cao trong biểu đồ.

Một decorator và component của nó không đồng nhất.

Nhiều đối tượng nhỏ.


3.2.4.4.7 Cài đặt

Giao diện phù hợp.

Không chú trọng lớp Decorator trừu tượng.

Giữ các lớp thành phần ít quan trọng.

Thay đổi lớp vỏ của đối tượng ngược lại với thay đổi lớp lõi trong nó.


3.2.4.4.8 Các mẫu liên quan:

Adapter: Một Decorator là khác biệt với một adapter trong đó, decorator chỉ thay đổi các nhiệm vụ đối tượng, không thay đổi giao diện của nó. Một adapter sẽ đưa một đối tượng cho một giao diện mới một cách đầy đủ.

Composite: Một Decorator có thể nhìn nhận như một thành phần suy giảm với chỉ một thành phần.

Strategy: Một decorator cho phép bạn thay đổi skin của một đối tượng. một chiến lược cho phép bạn thay đổi bên trong của nó. Đó là những phương pháp lựa chọn của việc thay đổi một đối tượng.

3.2.4.5. Facade

3.2.4.5.1 Mục đích

Đưa ra một giao diện đồng nhất thay cho một tập các giao diện trong hệ thống con. Định nghĩa một giao diện mức cao giúp đơn giản hoá trong việc sử dụng hệ thống con.
3.2.4.5.2 Ví dụ

Khi định dạng một hệ thống sang nhiều hệ thống con, mục đích chính là làm giảm độ phức tạp, tối thiểu hoá hệ thống, giúp cho người phát triển nhìn từ đơn lẻ đến tổng thể.

Một phương pháp để đạt được hiệu quả là đưa ra một đối tượng bao quát đơn nhất, cung cấp một giao diện đơn giản để nhìn được chức năng tổng thể của một hệ thống con.

Ví dụ, trong môi trường lập trình, các ứng dụng truy xuất đến hệ thống con biên dịch của nó, chứa các lớp như Scanner, Parser, ProgramNode, BytecodeStream và ProgramNodeBuilder cài đặt compiler. Một số ứng dụng riêng cần truy cập những lớp này một cách trực tiếp. Nhưng hầu hết các client của một compiler không chi tiết như phân tích cú pháp hoặc bộ sinh mã nguồn. Nó chỉ đơn thuần dịch phần ớt mó. Như vậy, giao diện có hiệu quả mạnh nhhung ở mức thấp trong hệ thống con biên dịch và chỉ kết nối phần nhiệm vụ của chúng.

Để cung cấp mức cao mà có thể che cho client khỏi các lớp này, hệ thống con biên dịch cũng bao hàm một lớp Compiler, lớp này định nghĩa một giao diện đồng nhất chức năng của compiler. Lớp Compiler hoạt động giống như một giao diện tổng quát, ở đây là facade; Nó đưa ra một giao diện đơn giản và đơn hình cho hệ thống con compiler. Nó kết hợp các lớp này để cài dặt chức năng compiler mà không cần ẩn đi hoàn toàn về chúng. Ở đây, Compiler facade làm đơn giản hơn cho hầu hết các nhà lập trình không cần ẩn đi các công việc và chức năng ở mức thấp.


3.2.4.5.3 Ứng dụng

Cần cung cấp một giao diện đơn giản tới hệ thống con phức tạp. Làm cho hệ thống con có khả năng sử dụng lại được và dễ dàng thay đổi thích nghi, nhưng cũng khó hơn khi sử dụng cho client mà không cần thay đổi chỳng. Faỗade có thể cung cấp một khung nhìn mặc định đơn giản đơn giản của hệ thống con khi phù hợp cho hầu hết các client. Chỉ có các client cần nhiều tuỳ biến sẽ cần phải quan sát rộng ra faỗade.

Có một số sự phụ thuộc giữa các client và các lớp thực hiện của khái niệm trừu tượng. Đưa ra một faỗade để phân tách hệ thống con từ client và các hệ thống con khác, từ đó, phát triển hệ thống con một cách độc lập và hữu hiệu.

Muốn phân tầng hệ thống con. Sử dụng faỗade để định nghĩa một điểm đầu vào tới từng mức hệ thống con. Nếu các hệ thống con là phụ thuộc, chúng có thể đơn giản hoá sự phụ thuộc giữa chúng bằng cách tạo kết nối chúng với từng phần riêng lẻ khác thông qua faỗade của chúng.

3.2.4.5.4 Cấu trúc




3.2.4.5.5 Thành phần

Faỗade:

  • Biết các lớp hệ thống con nào hoạt động theo yêu cầu.

  • Client yêu cầu các đối tượng của hệ thống con phải phù hợp.

Subsystem classes:

  • Thực hiện chức năng hệ thống con.

  • Chịu sự phân công công việc của Faỗade Object.
3.2.4.5.6 Phối hợp cộng tác

Client giao tiếp với hệ thống con bằng cách gửi các yêu cầu tới Faỗade, và Faỗade này sẽ hướng client đến đối tượng hệ thống con phù hợp. Mặc dù, các đối tượng hệ thống con thực hiện công việc thực nhưng faỗade có thể thực hiện công việc của chính nó để chuyển giao diện của nó tới giao diện của hệ thống con.

Các client sử dụng Faỗade không cần phải truy cập vào các đối tượng hệ thống con một cách trực tiếp.


3.2.4.5.7 Kết quả

Bảo vệ khách hàng từ những thành phần của hệ thống con, vì thế sẽ giảm được số lượng các đối tượng mà khách hàng phải giải quyết và làm cho hệ thống con được sử dụng dễ dàng.

Tăng cường mối liên kết giữa hệ thống con và các client của nó. Các thành phần trong hệ thống con được kết nối chặt chẽ. Mối liên kết giúp bạn thay đổi các thành phần của hệ thống con mà không ảnh hưởng đến các client của nó.

Faỗade giúp phân lớp hệ thống và sự phụ thuộc giữa các đối tượng. Cỏc faỗade có thể lọc bỏ sự phức tạp hoặc những lệ thuộc có tính chất lũng vũng. Điều này có thể là kết quả quan trọng khi khách hàng và hệ thống con hoạt động độc lập.

Giảm sự phụ thuộc biên dịch là cần thiết trong hệ thống phần mềm lớn. Bạn muốn tiết kiệm thời gian bằng cách tối thiểu hoá việc biên dịch lại khi cỏc lúp hệ thống con thay đổi. Giảm sự lệ thuộc biên dịch với Faỗade có thể giới hạn việc biên dịch lại cần thiết cho sự thay đổi nhỏ trong hệ thống con quan trọng. Faỗade có thể làm đơn giản hệ thống cổng kết nối với các flatform khác bởi vì nó kộm phù hợp với việc xây dựng một hệ thống con phụ thuộc vào việc xây dựng tất cả những cỏi khỏc.

Nó không ngăn chặn ứng dụng từ việc sử dụng các lớp hệ thống con nếu chúng cần đến. Vì vậy bạn có thể chọn lựa giữa việc sử dụng dễ dàng và mang tính tổng quát.

3.2.4.5.8 Cài đặt

Giảm sự liên kết giữa client và hệ thống con : Sự liên kết giữa client và hệ thống con thậm chí có thể giảm hơn nữa bằng cách tạo cho faỗade một lớp trừu tượng cú các lớp con cụ thể làm cho có sự khác biệt trong việc thực hiện của hệ thống con. Client có thể giao tiếp với hệ thống con thông qua giao diện của lớp Faỗade trừu tượng. Việc kết nối trừu tượng này có thể giúp cho client khỏi biết đến việc thực hiện nào của hệ thống con là được sử dụng.

Lựa chọn để phân lớp là để cấu hình đối tượng Faỗade với các đối tượng hệ thống con khác nhau. Để làm theo yêu cầu của Faỗade, đơn giản là thay thế một hoặc nhiều đối tượng của hệ thống con.

Lớp hệ thống con chung ngược với lớp hệ thống con riêng lẻ: Hệ thống con là tương tự một lớp mà trong đó cả hai đều có giao diện , và đều gói gọn một số vấn đề - một lớp bao hàm trạng thái và thao tác, trong khi hệ thống con đóng gói các lớp. Tìm hiểu hiệu quả giao diện public và private của lớp thì mới có thể tìm hiểu về giao diện public và private của hệ thống con.

Đối với giao diện hệ thống con, chung bao gồm các lớp mà tất cả các client có thể truy cập. giao diện Private chỉ dùng cho việc mở rộng hệ thống con. Lớp Faỗade là một phần của giao diện chung, nhưng không phải là phần duy nhất. Các lớp hệ thống con khác cũng đều được sử dụng chung.

Làm cho các lớp riêng của hệ thống phụ sẽ có ích, nhưng một vài ngôn ngữ hướng đối tượng hỗ trợ nó. Gần đây C++ đã thêm vào không gian tên đối với ngôn ngữ giúp bạn đưa ra được các lớp chung của hệ thống con.

3.2.4.5.9 Các mẫu liên quan

Abstract Factory có thể được sử dụng với Faỗade để cung cấp một giao diện cho việc tạo các đối tượng hệ thống con trong phương pháp độc lập hệ thống con. Mediator tương tự như Faỗade trong đó nó trừu tượng hoá chức năng của các lớp có sẵn. Tuy nhiên, mục đích của Mediator là để trừu tượng hoá bất kỳ một giao tiếp nào giữa các đối tượng với cùng nhiệm vụ, chức năng, tập trung hoá thường xuyên mà không thuộc về bất kỳ một đối tượng nào trong số đó. Cỏc cộng tác của mediator đều nhận thức và giao tiếp với mediator thay cho việc giao tiếp trực tiếp giữa các cộng tác có liên quan. Ngược lại, Faỗade chỉ trừu tựợng phối ghộp cỏc đối tượng hệ thống con để làm chúng dễ sử dụng hơn. Nó không chỉ rõ các chức năng mới và các lớp hệ thống con không biết về nó.

Thường thường chỉ có đối tượng Faỗade được yêu cầu, vì vậy các đối tượng Faỗade thường là Singleton.


3.2.4.6. Flyweight mẫu

3.2.4.6.1 Mục đích

Sử dụng việc dùng chung để hỗ trợ cho số lượng lớn các đối tượng tốt đó biờt (fine-grained) một cách có hiệu quả
3.2.4.6.2 Ứng dụng

Hiệu quả của Flyweight mẫu phụ thuộc vào việc nó được sử dụng ở đâu, như thế nào. Việc ứng dụng của Flyweight mẫu khi tất cả các vấn đề sau đây là đúng.

Một ứng dụng sử dụng nhiều đối tượng

Chi phí bảo quản lớn bởi vì số lượng tuyệt đối của đối tượng

Tất cả trạng thái đối tượng có thể được tác động từ bên ngoài

Nhiều nhóm đối tượng có thể được thay thế bởi quan hệ của vài đối tượng chung khi trạng thái ngoài được xoá bỏ.

Ứng dụng không phụ thuộc vào việc đồng nhất đối tượng. Vỡ cỏc đối tượng Flyweight có thể được dùng chung, các kiểm tra tính đồng nhất sẽ thật sự đối với đối tượng dễ phân biệt.


3.2.4.6.3 Cấu trúc:

Biểu đồ đối tượng chỉ ra làm thế nào các flyweight được dùng chung;






3.2.4.6.4 Thành phần:

Flyweight:Khai báo một giao diện thông qua những flyweight có thể nhận và hoạt động ở trạng thái ngoài.

ConcreteFlyweight:



  • Thực hiện giao diện Flyweight và lưu trữ thêm đối với trạng thái trong, nếu có. Đối tượng ConcreteFlyweight phải có thể dùng chung. Bất kì trạng thái nào lưu trữ phải là trạng thái trong. Đó là, nó phải độc lập với ngữ cảnh đối tượng ConcreteFlyweight.

UnsharedConcreteFlyweight:

  • Không phải tất cả các lớp con của Flyweight cần phải dùng chung. Giao diện Flyweight có thể chung, không bắt buộc. Có điểm chung giữa các đối tượng ConcreteFlyweight để cú cỏc đối tượng Flyweight cú cỏc nhỏnh con cùng mức trong cấu trúc đối tượng flyweight(như các lớp hàng và cột)

FlyweightFactory

  • Tạo và quản lớ cỏc đối tượng Flyweight.

  • Đảm bảo rằng các flyweight được dùng chung một cách thích hợp. Khi client yêu cầu flyweight thì đối tượng flyweight factory cung cấp trường hợp hiện hữu hoặc tạo ra một trường hợp, nếu không tồn tại.

Client:

  • Duy trì mối quan hệ giữa các flyweight.

  • Tính toán hay lưu trữ trạng thái ngoài của flyweight.
3.2.4.6.5 Phối hợp cộng tác.

Trạng thái mà flyweight cần để thực hiện chức năng như được kí tự hoá cả bên trong và bên ngoài. Trạng thái trong lưu giữ đối tượng ConcreteFlyweight.Trạng thái ngoài được lưu giữ bởi đối tượng client. Các client chuyển trạng thái này đến flyweight khi chúng cần đến hoạt động của nó.

Các client không nên giải thích trực tiếp với ConcreteFlyweight. Client phải thu được các đối tượng ConcreteFlyweight được dành riêng từ đối tượng Flyweight để đảm bảo chúng được dùng chung một cách thích hợp.


3.2.4.6.6 Kết quả.

Flyweight có thể đưa ra chi phí thời gian chạy kết hợp với việc chuyển, tìm kiếm và/hoặc tính toán trạng thái ngoài. đặc biệt nếu nó đó được lưu trữ như trạng thái bên trong.Tuy nhiên, hầu hết chi phí không gian sẽ sai lệch khi nhiều Flyweight được dùng chung.

Bộ lưu trữ là mang tính chức năng của một vài yếu tố:

Việc giảm tổng số các trường hợp cho việc dùng chung.

Số lượng trạng thái trong cho một đối tượng.

Liệu trạng thái bên ngoài có được lưu trữ hay không.

3.2.4.6.7 Cài đặt

Xoá bỏ trạng thái bên ngoài: Khả năng ứng dụng của mẫu được quyết định chủ yếu dễ dàng như thế nào để định rõ đối tượng bên ngoài và xoỏ nó khỏi đối tượng được dùng chung. Xoá bỏ trạng thái bên ngoài sẽ khụng giỳp làm giảm chi phí lưu trữ nếu nó có nhiều trạng thái khác nhau của trạng thái bên ngoài như là việc cú cỏc đối tượng trước khi dùng chung. Trường hợp lý tưởng là trạng thái bên ngoài có thể được tính toán từ cấu trúc riêng biệt của đối tượng, một đối tượng nhỏ hơn nhiều so với bộ lưu trữ yêu cầu.

Quản lý các đối tượng dùng chung: Vỡ cỏc đối tượng được dùng chung nờn cỏc client không nên giải thích một cách trực tiếp. FlyweightFactory đưa các khách hàng xác định một flyweight đặc biệt. Các đối tượng của FlyweightFactory thường sử dụng bộ lưu trữ liên kết để giỳp cỏc client tra cứu các tiện ích của Flyweight. Ví dụ FlyweightFactory trong trình soạn thảo Document có thể giữ bảng của Flyweight được lập bằng mó kớ tự. Người quản lí quay trở lại thuộc tính của Flyweight để đưa ra mã của nó, tạo ra flyweight nếu nó chưa tồn tại.

Khả năng có thể dùng chung cũng ngụ ý rằng một vài dạng của referency counting hoặc thu lượm dữ liệu không thích hợp để phục hồi bộ lưu trữ của Flyweight khi mà nó không cần đến nữa. Tuy nhiên nó cũng không cần thiết nếu số lượng các flyweight là cố định. Trong trường hợp đó, flyweight cũng đánh giá để giữ lại lâu dài.

3.2.4.6.8 Các mẫu liên quan:

Flyweight mẫu thường được kết hợp với composite mẫu để được thực hiện một cấu trúc biểu đồ logic có tính chu kỳ trong đồ hoạ (directed-acyclic graph) với cỏc nỳt lỏ được dùng chung.

Nó thường tốt nhất để thực hiện đối tượng State và Strategy như là Flyweight.


3.2.4.7. Proxy

3.2.4.7.1 Mục đích

Đưa ra một thay thế hoặc phần giữ chỗ( phần bộ nhớ máy tính dành cho thông tin sẽ được cung cấp về sau) cho đối tượng khác để kiểm soát truy xuất của nó.
3.2.4.7.2 ví dụ

Soạn thảo tài liệu có thể được nhúng trong các đối tượng đồ hoạ trong tài liệu. Một số đối tượng đồ hoạ, ví dụ tường quét hình ảnh là rất tốn chi phí để tạo. Nhưng để mở một tài liệu lại rất nhanh, nên chúng ta tránh tạo tất cả các đối tượng chi phí lớn mụĩ khi tài liệu được mở. Yêu cầu ở đây là tạo hình ảnh theo yêu cầu và hình ảnh bị ẩn đi mỗi khi trường hợp này xảy ra. Nhưng điều quan trọng là cần phải ghép tài liệu vào hình ảnh như thế nào? Và làm thế nảo mà ta ẩn đi thực tế ảnh được tạo theo yêu cầu như thế nào nên không cần phức tạp cài đặt soạn thảo.

Giải pháp là sử dụng một đối tượng khác, một hình ảnh proxy, hoạt động với mục đích thay thế cho hình ảnh thật.

Hình ảnh proxy tạo hình ảnh thật chỉ khi soạn thảo tài liệu yêu cầu hiển thị bằng cách gọi hàm Draw của nó. Proxy hướng các yêu cầu sau một cách trực tiếp tới hình ảnh. Vì vậy cần giữ mối liên quan đến hình ảnh sau khi nó được tạo ra.

Giả sử các hình ảnh được lưu trong các file chia nhỏ. Trong trường hợp này, chúng ta có thể sử dụng tên file như là một tham chiếu đến đối tượng thực.

Trình soạn thảo tài liệu truy xuất đến hình ảnh nhúng thông qua giao diện được định nghĩa bởi lớp đồ hoạ ảo. ImageProxy là một lớp cho hình ảnh tạo ra theo yêu cầu, và nó duy trì tên file như là một tham chiếu tới hình ảnh trên đĩa. Nó cũng lưu giới hạn của hình ảnh và tham chiếu đến thể hiện hình ảnh thực. Tham chiếu này sẽ không có giá trị cho đến khi proxy khởi tạo hình ảnh thực. Hàm Draw đảm bảo hình ảnh được khởi tạo trước khi hướng đến các yêu cầu. GetExtend đưa ra yêu cầu tới hình ảnh, chỉ khi nó được khởi tạo; mặt khác ImageProxy trả lại giới hạn mà nó lưu trữ.

3.2.4.7.3 Ứng dụng

Proxy có thể được áp dụng bất cứ khi nào có nhu cầu để làm tăng tính chuyển đổi đa chiều và phức tạp tới một đối tượng hơn là một con trỏ đơn giản.

Có một số điều kiện khi áp dụng Proxy mẫu :

Remote proxy cung cấp việc biểu diễn cục bộ cho đối tượng trong các không gian địa chỉ khác nhau.

Proxy ảo tạo ra các đối tượng chi phí cao dựa trên yêu cầu.

Proxy bảo vệ kiểm soát truy xuất đến đối tượng thông thường. Các proxy bảo vệ thường hữu ích khi các đối tượng có quyền truy cập khác nhau.

Tham chiếu thông minh là sự thay thế cho một con trỏ rỗng để thực hiện các hoạt động thêm vào khi một đối tượng được truy xuất,

Đếm số tham chiếu với đối tượng thực để nó có thể tự động giải phóng khi không có tham chiếu nào nữa.

Tải đối tượng lưu vào bộ nhớ khi tham chiếu lần đầu.

Kiểm tra xem đối tượng thực sao cho nó bị khoá trước khi truy xuất để đảm bảo không có đối tượng nào có thể thay thế nó.

3.2.4.7.4 Cấu trúc:

Biểu đồ đối tượng của cấu trúc proxy tại thời gian chạy.






3.2.4.7.5 Thành phần:

Proxy: Duy trì một tham chiếu cho phép proxy truy cập chủ đề thực. Proxy có thể liên quan đến Subject nếu các giao diện của RealSubject và Subject là như nhau.

      • Cung cấp giao diện giống như của Subject để proxy có thể thay cho chủ thể thực.

      • Điều khiển truy cập đến chủ thể thực và có chức năng tạo và xoỏ nó.

Một số nhiệm vụ khác phụ thuộc vào kiểu proxy.

  • Remote proxy có chức năng mó hoỏ yêu cầu và đối số của nó; dùng để gửi lệnh đã được mó hoỏ đến chủ thể thực vào những không gian địa chỉ khác nhau.

  • Virtual proxy có thể lưu giữ thêm thông tin về chủ thể thực để chúng có thể trì hoãn việc truy cập nó.

  • Protection proxy: kiểm tra xem người gọi có chấp nhận truy cập để thực hiện yêu cầu.

Subject:

  • Định nghĩa một giao diện chung cho RealSubject và Proxy nên một Proxy có thể được sử dụng bất kỳ nơi đâu mà RealSubject mong muốn.

RealSubject:

  • Định nghĩa một đối tượng thực mà proxy biểu diễn.
3.2.4.7.6 Phối hợp cộng tác

Proxy hướng yêu cầu đến chủ thể thực khi thích hợp, phụ thuộc vào từng dạng của proxy.
3.2.4.7.7 Kết quả.

Proxy giới thiệu ở cấp độ gián tiếp khi truy cập đối tượng. Sự bổ sung gián tiếp có nhiều công dụng tuỳ thuộc vào loại proxy.

Remote proxy có thể ẩn đi thực tế rằng một không gian địa chỉ ở trong một không gian địa chỉ khác.

Virtual Proxy có thể được biểu diễn sự tối ưu như việc tạo ra một đối tượng theo yêu cầu.

Còn một vấn đề tối ưu hoá nữa là Proxy có thể ẩn đi từ phía client. Được gọi là sao chép dựa trên ghi lưu, và có liên quan đến việc khởi tạo yêu cầu. Việc sao chép đối tượng lớn và phức tạp có thể là một hoạt động tốn kém. Nếu bản sao chép không bao giờ được sửa đổi thỡ nó sẽ không phải chịu chi phí này.

Bằng việc sử dụng một proxy để làm chậm quá trình sao chép, ta đảm bảo rằng chỉ phải trả chi phí sao chép đối tượng khi mà nó được sửa đổi. Để làm sao chép dựa trên ghi lưu, chủ thể phải được tham chiếu. Việc sao chép proxy sẽ chẳng thực hiện được gì nhiều hơn việc gia tăng tham chiếu này. Chỉ khi client yêu cầu một hoạt động để sửa đổi chủ thể làm cho proxy thực sự sao chép nó. Trong trường hợp đó, Proxy buộc phải giảm tham chiếu của chủ thể . Khi tham chiếu này tiến đến 0, chủ thể bị xoá.

Sao chép dựa trên lưu ghi có thể giảm chi phí đáng kể đối với chủ thể lớn.


3.2.4.7.8 Cài đặt

Proxy có thể khai thác các đặc điểm ngôn ngữ sau :

Quá tải thành viên truy cập thao tác trong C++.

Proxy không cần biết dạng của đối tượng thật.

3.2.4.7.9 Những mẫu liên quan:

Adapter: Một adapter cung cấp một giao diện khác tới đối tượng nó điều biến. Theo mục đích này, proxy cung cấp giao diện tương tự như là chủ thể của nó.

Decorator: Mặc dù decorator có thể có các thực hiện giống nhau như proxy, decorator có mục đích khác nhau. Một decorator thêm một hoặc nhiều hơn nhiệm vụ tới đối tượng, vị trí mà proxy kiểm soát việc truy cập đến đối tượng.



Kết luận: Adaptor và Bridge có một số thuộc tính giống nhau. Cả hai mẫu này đều tăng cường tính linh động bởi việc cung cấp một mức gián tiếp tới đối tượng khác. Cả hai mẫu này đều liên quan tới những yêu cầu đối với đối tượng này từ một giao diện.

Sự khác nhau chủ yếu giữa hai mẫu này dựa vào những mục đích riêng của nó. Adadaptor tập trung giải quyết sự không tương đồng giữa hai giao diện hiện có, nó không tập trung vào các giao diện này được thực hiện như thế nào, hoặc có được coi là có hoạt động độc lập hay không. Đó là cách để tạo hai lớp thiết kế độc lập cùng hoạt động với nhau. Bridge trái lại kết nối một khái niệm trừu tượng với các bước thực hiện của nó. Nó cung cấp một giao diện ổn định đến các đối tượng khác ngay cả khi nó giỳp bạn phân biệt các lớp thực hiện nó, đồng thời định vị trớ cỏc bước thực hiện mới trong hệ thống có liên quan.

Sự khác nhau giữa Adaptor mẫu và Bridge là thường được sử dụng tại những điểm khác nhau trong vòng đời của phần mềm . Một adaptor đều trở nên cần thiết khi bạn nhận thấy rằng hai lớp đối xứng nhau nên hoạt động cùng nhau nhìn chung để tránh việc mã phụ thuộc, việc kết nối là không thể thấy trước được; Ngược lại người sử dụng mỗi Bridge phải hiểu được trước rằng, mỗi trừu tượng phải có một số bước thực hiện và cả hai có thể liên quan đến nhau. Adaptor mẫu giúp chương trình hoạt động sau khi chúng được tạo ra, còn bridge mẫu làm cho chương trình hoạt động trước khi chúng được tạo ra. Điều đó không có nghĩa là adaptor mẫu kém tính năng hơn Bridge. Mỗi một mẫu này giải quyết một vấn đề khác nhau.

Có thể coi giao diện là một adadaptor, nhưng việc thông dịch đã chỉ ra thực tế là giao diện sẽ xác định một giao diện mới và bất cứ lúc nào một adaptor mẫu được tái sử dụng. Lưu ý rằng một Adaptor mẫu giúp hai giao diện đồng thời tồn tại và hoạt động cùng nhau để tạo ra một giao diện mới.

Tương quan giữa Composite, Decorator và Proxy. Composite và Decorator cú cỏc biểu đồ cấu trúc giống nhau và phản ánh thực tế là cả hai Composite và decorator đều phụ thuộc vào thành phần kết cấu để tạo một số đối tượng đóng mở. Điểm chung này có thể giúp bạn nghĩ tới một đối tượng bổ trợ như một phương tiện kết nối. Nhưng đặc điểm này không đúng với đặc điểm của mẫu Decorator . Sự giống nhau là ở những điểm nối và lặp lại với những mục đích khác nhau.

Decorator được thiết kế nhằm cung cấp tính năng cho các đối tượng không có các lớp Composite. Decorator tránh được sự nổ của lớp Composite mà xuất phát từ tính năng của các điểm nối có liên quan, có thể được xử lý đồng loạt ở nhiều đối tượng. Sự tập trung của nó không đồng loạt mà tiêu biểu. Những mục đích này là rõ ràng nhưng không bổ trợ cho nhau. Kết quả là Decorator và Composite thường được sử dụng phối hợp với nhau. Sẽ có một lớp ảo và một số các lớp Compositen có thể được kết hợp với nhau, một vài trong số đó là các Decorator và một số khác thực hiện xây dựng hệ thống. Trong trường hợp này, cả hai Composite và Decorator sẽ có một giao diện chung. Theo Decorator mỗi kết cấu là thành phần cơ bản. Theo Composite mỗi Composite là một lá. Tất nhiên chỳng khụng sử dụng với nhau khi ta nhận thấy điều này, mục đích thực hiện của chúng là khác nhau.

Mẫu có cấu trúc giống Decorator là Proxy. Cả hai mẫu này mô tả cách cung cấp một cấp độ hướng gián tiếp tới một đối tượng và sự thực hiện của cả proxy và Decorator nhằm thông báo cho đối tượng khỏc đó được yêu cầu, tuy nhiên chúng lại được thiết kế với các mục đích khác nhau

Cũng giống như Decorator, Proxy thiết lập đối tượng và cung cấp giao diện xác định cho client. Không giống như Decorator , Proxy không liên quan đến việc tiếp xúc và tháo gỡ các thiết bị và đồng thời không được thiết kế cho các thành phần kết cấu. Mục đích của nó là cung cấp vị trí cho các đối tượng khi không thuận tiện khi không để truy nhập đối tượng một cách trực tiếp.

Trong Proxy mẫu các đối tượng xác định chức năng chính và tiếp cận tới chúng, trong Decorator thành phần kết cấu cung cấp một số bộ phận của chức năng nhiều hơn các de còn lại. Decorator xác định vị trí mà một chức năng cả các đối tượng có thể được quyết định tại một tệp thời gian, ít nhất là không thuận lợi. Sự đóng mở làm cho thành phần kết cấu trở nên cần thiết cho de. Trường hợp này không giống đối với Proxy, vì Proxy tập trung vào mối liên quan giữa Proxy và đối tượng của nó. Mối liên quan này có thể được giải thích bằng số liệu.

Sự khác nhau này là rất cơ bản, vỡ chỳng cú cỏc phương pháp giải quyết tiêu biểu trong việc thiết kế hướng đối tượng, nhưng điều này không có nghĩa là các mẫu này không thể nối kết với nhau. Bạn có thể nhận thấy, Proxy và de bổ trợ các chức năng tới một Proxy hoặc một Decorator riêng rẽ. Và rút ngắn khoảng cách giữa các đối tượng, mặc dù sự kết hợp này có thể có ích, nhưng cũng cần phải quyết định mẫu nào hữu ích hơn.



Каталог: books -> luan-van-de-tai -> luan-van-de-tai-cd-dh
luan-van-de-tai-cd-dh -> Thế kỷ 21, cùng với sự phát triển nh­ vũ bão của khoa học kỹ thuật, của công nghệ thông tin. Sự phát triển kinh tế tác động đến tất cả mọi mặt đời sống kinh tế xã hội
luan-van-de-tai-cd-dh -> VIỆN ĐẠi học mở HÀ NỘi khoa công nghệ thông tin đỒ Án tốt nghiệP ĐẠi họC
luan-van-de-tai-cd-dh -> Phần một : Tình hình thu hút vốn đầu tư trên thị trường vốn việt nam hiện nay
luan-van-de-tai-cd-dh -> TRƯỜng đẠi học cần thơ khoa công nghệ BỘ MÔN ĐIỆn tử viễn thôNG
luan-van-de-tai-cd-dh -> Em xin chân thành cảm ơn! Vị Xuyên, ngày 19 tháng 5 năm 2012 sinh viêN
luan-van-de-tai-cd-dh -> PHẦn I mở ĐẦu tầm quan trọng và SỰ ra đỜi của giấY
luan-van-de-tai-cd-dh -> Đề tài: Tìm hiểu về vấn đề sử dụng hợp đồng mẫu trong đàm phán ký kết hợp đồng mua bán ngoại thương và thực tiễn ở Việt Nam
luan-van-de-tai-cd-dh -> Đề tài phân tích thực trạng kinh doanh xuất khẩu cà phê nhân của các doanh nghiệP
luan-van-de-tai-cd-dh -> Giao tiếp máy tính và thu nhận dữ liệU ĐỀ TÀI: TÌm hiểu công nghệ 4g lte

tải về 396.06 Kb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6   7




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương