Adapter Pattern và Facade Pattern – trngơi nghỉ buộc phải phù hợp nghi

Trong chương thơm này, công ty chúng tôi đã cố gắng triển khai các chiến-công-bất-khả-thi như ghép một cái chốt vuông vào một chiếc lỗ tròn. Hoàn toàn rất có thể lúc họ bao gồm các mẫu mã thiết kế. Bạn ghi nhớ Decorator Pattern chứ? Chúng tôi quấn những đối tượng người sử dụng nhằm hỗ trợ cho việc đó trách nát nhiệm mới. Bây giờ, Shop chúng tôi đang bọc một trong những đối tượng người dùng với cùng 1 mục đích khác: để làm đến đồ họa của chúng trnghỉ ngơi đề nghị khác đi. Tại sao cần làm điều đó? Khi kia, bạn cũng có thể kiểm soát và điều chỉnh một kiến tạo mong muốn đợi một interface thành một tấm implements một interface khác (Adapter Pattern). Đó không phải là tất cả; Trong lúc công ty chúng tôi làm việc cùng với nó, công ty chúng tôi đang xem xét một mẫu mã không giống bao bọc những đối tượng người tiêu dùng để đơn giản hóa interface của đối tượng người sử dụng đó (Facade Pattern).

Bạn đang xem: Adapter pattern là gì

Adapter Pattern bao phủ bọn chúng ta

quý khách hàng không chạm chán khó khăn nhằm phát âm OO adapter là gì, vì vậy giới thực có tương đối nhiều. Cho một ví dụ: quý khách sẽ khi nào phải sử dụng máy vi tính vị Mỹ sản xuất ở 1 non sông châu Âu chưa? Khi kia, bạn có thể cần một cỗ biến hóa mối cung cấp AC…


*

Quý Khách biết adapter làm cho gì: nó nằm ở giữa phích gặm của máy tính với ổ cắm AC châu Âu; các bước của chính nó là kiểm soát và điều chỉnh ổ cắm châu Âu để bạn có thể cắm laptop của chính bản thân mình vào đó và thừa nhận nguồn điện. Hoặc quan sát vào nó Theo phong cách này: Adapter chuyển đổi interface của ổ cắm thành một cái nhưng máy tính xách tay của doanh nghiệp hy vọng đợi.

Một số AC adapters khôn xiết đơn giản – bọn chúng chỉ chuyển đổi kiểu dáng của ổ cắn làm thế nào để cho cân xứng cùng với phích cắm của người sử dụng cùng bọn chúng truyền thẳng dòng điện AC – nhưng những adapter không giống tất cả bên phía trong phức hợp rộng cùng rất có thể cần được tăng hoặc bớt mối cung cấp nhằm phù hợp với nhu yếu của sản phẩm công nghệ.

Được rồi, đó là nhân loại thực, còn bộ OO adapter thì sao? Chà, OO adapter của chúng tôi đóng vai trò hệt như các Adapter vào trái đất thực: nó có một interface với điều chỉnh nó theo interface cơ mà client đang mong muốn chờ.

Adapter pattern trong hướng đối tượng

Giả sử chúng ta ĐÃ CÓ một hệ thống phần mềm mà lại bạn cần làm việc với framework xuất phát điểm từ một nhà cung ứng new, nhưng mà đơn vị cung cấp new đã xây dựng hình ảnh của mình không giống cùng với bên hỗ trợ trước kia (Hệ thống ứng dụng của bạn chỉ thao tác làm việc được cùng với bối cảnh của nhà cung ứng trước đó):


*

Được rồi, các bạn không muốn giải quyết sự việc bằng cách thay đổi code bây giờ của bản thân mình (cùng chúng ta cũng tất yêu đổi khác code của nhà cung ứng mới) (điểm chủ chốt của vấn đề là khối hệ thống của doanh nghiệp và những lớp từ nhà hỗ trợ new đa số chẳng thể chuyển đổi, khi đó vẫn đề xuất đến Adapter Pattern). Vậy chúng ta có tác dụng gì? Chà, chúng ta cũng có thể viết một lớp đưa interface bên hỗ trợ new thành interface cơ mà bạn ao ước ngóng.


*

Adapter vận động như fan trung gian bằng cách nhấn những yên cầu trường đoản cú client (khối hệ thống của bạn) với thay đổi chúng thành những đề nghị gồm ý nghĩa so với những lớp của phòng hỗ trợ new.


*

Nếu kia đi kiểu như vịt cùng kêu giống như vịt, khi ấy nó phải rất có thể là một trong con vịt kê tây được bọc vị Duck adapter…


*

Đây là thời hạn giúp xem phương pháp một adapter vận động. Nhớ nhỏ vịt của họ từ bỏ Chương thơm 1 không? Hãy cùng xem lại một phiên bạn dạng đơn giản hóa của những interface Duck:


Ở phía trên, một lớp nhỏ của Duông chồng, MallardDuck.


Bây tiếng, thời hạn để chạm chán gỡ những crúc gà tây mới:


Tại trên đây, giải pháp Client áp dụng Adapter:

Client chỉ dẫn từng trải mang đến adapter bằng phương pháp điện thoại tư vấn một cách tiến hành bên trên nó.Adapter gửi hưởng thụ thành một hoặc nhiều cuộc Gọi đến adaptee bởi adaptee interface.Client nhận được tác dụng của cuộc hotline và không lúc nào biết gồm một Adapter đang tiến hành biến đổi.

Lưu ý rằng Client cùng Adaptee đã làm được tách rời – bọn chúng chần chừ về nhau.

Bài tập:

Giả sử bọn họ cũng cần phải một Adapter đổi khác Duck thành Turkey (ví dụ thời điểm nãy là Turkey gửi thành Duck). Hãy Hotline nó là DuckAdapter. Hãy viết lớp kia.

Đáp án:
những bài tập 2:

Bạn giải pháp xử lý phương thơm sản phẩm fly như vậy nào?

Không có thắc mắc ngớ ngẩn

Hỏi: Adapter đề nghị từng nào “sự gửi đổi”? Nó dường như nhỏng giả dụ tôi nên biến đổi target interface to, tôi có thể gồm RẤT NHIỀU các bước vào tay.

Trả lời: Công Việc implement một adapter thực thụ Tỷ Lệ với kích thước của interface bạn cần hỗ trợ giống hệt như target interface của người tiêu dùng. Hãy Để ý đến về những lựa chọn của doanh nghiệp. Quý khách hàng rất có thể buộc phải viết lại tất cả các cuộc Call phía client của bản thân mình mang lại interface, điều đó sẽ dẫn mang lại không ít các bước điều tra với thay đổi code. Hoặc, bạn cũng có thể hỗ trợ cụ thể một tấm, gói gọn gàng toàn bộ các đổi khác trong một lớp.

Hỏi: Có phải một adapter luôn phủ quanh một và chỉ một lớp không?

Trả lời: Vai trò của Adapter Pattern là thay đổi một interface này sang interface khác. Trong khi phần nhiều những ví dụ về adapter pattern chỉ kể tới một adapter phủ bọc một tờ adaptee, cả nhị bọn họ đa số biết nhân loại thực thường lộn xộn rộng một chút. Vì vậy, bạn có thể tất cả các trường hợp trong số đó một adapter giữ hai hoặc các adaptee cần thiết để thiết lập target interface.

Vấn đề này tương quan cho một mẫu mã không giống call là Facade Pattern; đông đảo tín đồ thường xuyên nhầm lẫn nhì điều này. Chúng ta đang xem lại điều đó lúc chúng ta nói về facade ở đoạn sau vào chương thơm này.

Hỏi: Điều gì sẽ xảy ra nếu như tôi gồm cả những phần cũ và new vào hệ thống của chính mình, những phần cũ mong mỏi đợi interface từ bỏ công ty cung cấp cũ, tuy thế chúng tôi sẽ viết những phần mới để sử dụng interface đơn vị hỗ trợ mới? Nó sẽ gây nên lầm lẫn Khi sử dụng một adapter ở chỗ này với interface chưa được mngơi nghỉ làm việc kia. Sẽ tốt hơn hay không giả dụ tôi chỉ viết code cũ của bản thân mình cùng quên adapter?

Trả lời: Không độc nhất vô nhị thiết. Một điều chúng ta cũng có thể làm là sinh sản Two Way Adapter cung ứng cả nhị interface. Để chế tác Two Way Adapter, chỉ cần implement cả hai interface tương quan, do đó adapter có thể vận động nlỗi một interface cũ hoặc interface mới.

Định nghĩa Adapter Pattern

Đã đầy đủ adapter cho vịt, con kê tây cùng cỗ nguồn AC; hãy thực tiễn và quan sát vào khái niệm đồng ý của Adapter Pattern:

*

(Adapter Pattern chuyển đổi đồ họa của một tờ thành một hình ảnh khác mà lại client mong muốn đợi. Adapter được cho phép các lớp hoạt động cùng cả nhà nhưng bình thường là quan yếu cũng chính vì sự ko cân xứng về interface)

Bây giờ đồng hồ, họ biết chủng loại này được cho phép client áp dụng một interface không tương hợp bằng phương pháp tạo Adapter thực hiện đổi khác. Điều này có công dụng bóc tách tránh client khỏi interface vẫn xúc tiến và giả dụ bọn họ mong muốn đợi interface đổi khác theo thời hạn, adapter vẫn gói gọn biến đổi đó nhằm client không phải sửa đổi mỗi lúc đề nghị chuyển động với interface bắt đầu.

Chúng tôi sẽ xem xét hành vi runtime của mẫu mã Adapter Pattern; hãy xem sơ thứ lớp của nó:


Adapter Pattern tất cả vừa đủ các qui định xây đắp OO tốt: chất vấn việc phối kết hợp những đối tượng người tiêu dùng (object composition) nhằm quấn adaptee với interface được sửa đổi. Cách tiếp cận này còn có thêm điểm mạnh là bạn có thể sử dụng adapter cùng với bất kỳ lớp con làm sao của adaptee.

Hình như, khám nghiệm làm cầm cố làm sao chủng loại này rất có thể link client với cùng một interface, không hẳn bằng một sự thừa kế; chúng ta cũng có thể áp dụng một vài ba adapter, từng cỗ biến đổi một tập những lớp backend khác nhau. Hoặc, bạn có thể thêm các implementation bắt đầu sau đó, miễn sao chúng vâng lệnh Target interface.

Object adapter cùng class adapter

Bây giờ tuy nhiên đã định nghĩa mẫu mã, Shop chúng tôi vẫn chưa nói cho bạn toàn bộ câu chuyện. Thực tế có nhì một số loại adapter: object adapter với class adapter. Chương này đã nói đến những object adapter với sơ thứ lớp sinh sống trên là sơ đồ của object adapter.

Vậy class adapter là gì với tại sao Shop chúng tôi không nói với bạn về nó? Bởi vị bạn phải nhiều kế thừa nhằm thiết lập nó, vấn đề đó quan trọng gồm vào Java (ko hỗ trợ nhiều kế thừa). Nhưng, điều này ko Tức là chúng ta ko mong muốn về class adapter khi áp dụng đa kế thừa trong ngữ điệu ngưỡng mộ của bạn! Hãy nhìn vào sơ thứ lớp đến nhiều kế thừa.

*

Nhìn gồm quen không? Đúng vậy – khác biệt duy nhất là cùng với class adapter, chúng ta thừa kế cả TargetAdaptee, trong những khi cùng với object adapter, họ thực hiện composition (kết hợp) nhằm chuyển từng trải mang đến một Adaptee.

Sử dụng sức khỏe bộ não

Object adapter và class adapter áp dụng nhì chân thành và ý nghĩa khác nhau của adapting với adaptee (composition so với kế thừa). Làm thế nào nhằm hồ hết biệt lập tiến hành ảnh hưởng đến tính khả dụng của adapter pattern?

Duck Magnets

Công việc của người tiêu dùng là lấy duông xã cùng turkey magnet với chuyển chúng qua một phần của sơ vật dụng thể hiện sứ mệnh của 2 con “chim” đó, trong ví dụ trước đó của Shop chúng tôi (Cố nuốm không dàn ra phía trên). Sau đó thêm chú thích của riêng biệt chúng ta nhằm diễn tả phương thức buổi giao lưu của nó.


*

Buổi thì thầm về tối nay: Object Adapter với Class Adapter gặp khía cạnh nhau

Object Adapter: Bởi bởi vì tôi sử dụng composition buộc phải tôi có lợi. Tôi không chỉ là có thể điều chỉnh một tấm adaptee, nhưng là hoàn toàn có thể kiểm soát và điều chỉnh bất kỳ lớp bé nào của nó.

Class Adapter: Điều kia đúng, tôi gặp vấn đề với điều này cũng chính vì tôi được gắn cùng với một tấm adaptee cụ thể, mà lại tôi bao gồm một lợi thế rất lớn bởi tôi implement lại toàn bộ adaptee. Tôi cũng rất có thể override hành động của adaptee nếu tôi phải chính vì tôi chỉ nên subclass.

Xem thêm: Nghề Account Director Là Gì ? Các Công Việc Của Account Manager

Object Adapter: Tại kiến thiết của tôi, Cửa Hàng chúng tôi mê say áp dụng composition rộng thừa kế; bạn cũng có thể đang lưu lại một vài ba dòng code, dẫu vậy tất cả hầu hết gì tôi có tác dụng là viết một không nhiều code để ủy quyền mang đến adaptee. Chúng tôi ý muốn duy trì đến mọi thiết bị linch hoạt.

Class Adapter: Có thể linh hoạt, hiệu quả? Không. Sử dụng class adapter, chỉ có một trong những tôi, chưa phải adapter và adaptee.

Object Adapter: Bạn hay được thực hiện vào một đối tượng người dùng bé dại buộc phải không? quý khách hàng hoàn toàn có thể gấp rút override một phương thức, tuy vậy ngẫu nhiên hành động làm sao tôi thêm vào adapter của chính mình đông đảo đang thao tác với lớp adaptee cùng toàn bộ những lớp bé của chính nó.

Class Adapter: Vâng, tuy nhiên điều gì sẽ xẩy ra nếu một tấm bé của adaptee thêm một trong những hành vi mới. Rồi sao?

Object Adapter: Này, thôi nào, tạm dừng 1 chút ít, tôi chỉ cần compose với lớp bé để gia công cho nó hoạt động.

Class Adapter: Nghe có vẻ lộn xộn …

Object Adapter: Quý Khách mong muốn thấy lộn xộn? Nhìn vào gương!

Adapter Pattern thế giới thực

Chúng ta hãy coi vấn đề sử dụng một Adapter đơn giản dễ dàng vào nhân loại thực…


Nếu các bạn vẫn là vấn đề với Java một thời gian, bạn có thể hãy nhớ là các hình dáng collection ban sơ (Vector, Stack, Hashtable cùng một vài trang bị khác) thiết đặt một thủ tục elements(), trả về một Enumeration. Giao diện Enumeration chất nhận được bạn chăm chút qua những bộ phận của của collection nhưng ko cần biết lên tiếng rõ ràng về phong thái chúng được thống trị trong collection.

Iterator thời hiện nay đại

khi Sun xuất bản những lớp Collection gần đây rộng, họ bước đầu thực hiện hình ảnh Iterator, như Enumeration, iterator cũng cho phép các bạn coi sóc sang 1 tập đúng theo các bộ phận vào collection, mà lại nhận thêm kỹ năng xóa các bộ phận.

Và bây giờ…

Chúng tôi thường xuyên yêu cầu đương đầu cùng với code được còn lại, bọn chúng thể hiện Enumerator interface, tuy nhiên công ty chúng tôi vẫn áp dụng code bắt đầu nhằm chỉ áp dụng những Iterator. Có vẻ nlỗi chúng ta đề nghị phát hành một adapter.

Chuyển đổi một Iterator thành Enumeration

Trước tiên, công ty chúng tôi đã chu đáo nhị đồ họa nhằm mày mò phương pháp các phương thức ánh xạ từ bỏ điều này thanh lịch chiếc kia. Nói bí quyết không giống, công ty chúng tôi vẫn đưa ra đều gì bắt buộc Gọi bên trên adaptee lúc client Call một thủ tục trên adapter.

*

Thiết kế Adapter

Tại đây, các lớp sẽ trông như: họ buộc phải một adapter triển khai đồ họa Target interface (Iterator) với được phối kết hợp (conpose) với một adaptee. Các cách làm hasNext() cùng next() cực kỳ dễ dàng để maps tự target cho adaptee: bọn họ chỉ việc tiến hành bọn chúng ngay hiện giờ. Nhưng bạn sẽ làm những gì với cách làm remove()? Hãy Để ý đến về nó một lát (với Shop chúng tôi đã đối phó với nó phía mặt dưới).

Bây giờ đồng hồ, tại chỗ này, sơ đồ dùng lớp:

*

Xử lý phương thức remove()

Chà, Cửa Hàng chúng tôi biết Enumeration không cung cấp remove. Nó là một trong những “read only” interface. Không bao gồm bí quyết làm sao nhằm kế thừa thủ tục remove() vừa đủ công dụng bên trên adapter. Điều rất tốt chúng ta có thể làm là ném runtime exception. May mắn nắm, các bên xây đắp đồ họa Iterator đã thấy trước nhu cầu này và tư tưởng cách làm remove() để nó hỗ trợ UnsupportedOperationException.

Đây là một ngôi trường hòa hợp nhưng mà adapter không hoàn hảo; client đang phải chú ý những trường thích hợp ngoại lệ tiềm tàng, mà lại miễn sao client cẩn trọng cùng adapter có document khá đầy đủ thì đấy là một phương án trọn vẹn phù hợp.

Viết adapter EnumerationIterator

Tại phía trên, code đơn giản và dễ dàng mà lại kết quả mang lại toàn bộ những lớp thừa kế vẫn đang tạo ra Enumeration:

*
Bài tập:

Mặc dù Java đã đi theo hướng của Iterator, mặc dù vẫn có tương đối nhiều client code dựa vào vào bối cảnh Enumeration, vì thế, một Adapter đổi khác Iterator thành Enumeration cũng tương đối bổ ích.

Viết một Adapter điều chỉnh Iterator thành một Enumeration. Quý khách hàng rất có thể demo code của chính bản thân mình bằng phương pháp biến đổi một ArrayList. Lớp ArrayList hỗ trợ đồ họa Iterator mà lại không cung ứng Enumeration.

Đáp án:
*

Sử dụng sức khỏe bộ não

Một số AC adapter không những chuyển đổi bối cảnh – chúng còn thêm các nhân tài khác ví như bảo vệ nguy cấp (nhỏng tự động ngắt nguồn), đèn tín hiệu với các một số loại chuông với còi khác.

Nếu các bạn định thực hiện những các loại kỹ năng này, bạn sẽ thực hiện mẫu mã nào?

Buổi thủ thỉ tối nay: Decorator Pattern với Adapter Pattern đàm đạo về việc khác biệt của họ

Decorator: Tôi đặc trưng hơn. Công bài toán của tớ là toàn bộ về trách nhiệm (responsibility) – các bạn hiểu được khi setup thêm một Decorator gồm liên quan thì sẽ có được một số trong những trách rưới nhiệm hoặc hành động bắt đầu được tiếp tế thiết kế của người tiêu dùng.

Adapter: quý khách hàng mong mỏi tất cả vinh quang trong lúc những adapter của công ty chúng tôi sẽ ngơi nghỉ trong hậu trường cùng làm cho rất nhiều quá trình không nhiều bạn biết đến: đổi khác những interface. Công vấn đề của Shop chúng tôi rất có thể không hào bóng, dẫu vậy client của chúng tôi chắc chắn rằng Reviews cao vì chưng Cửa Hàng chúng tôi tạo nên cuộc sống thường ngày của mình đơn giản hơn.

Decorator: Điều đó có thể đúng, nhưng mà đừng cho rằng Cửa Hàng chúng tôi ko thao tác làm việc chịu khó. khi bọn họ đề xuất decorate một đồ họa bự, whoa, rất có thể sút tương đối nhiều code.

Adapter: Hãy demo thay đổi một adapter khi chúng ta đề xuất phối hợp những lớp để hỗ trợ giao diện nhưng mà client của bạn mong muốn chờ. Bây tiếng thì khó khăn. Nhưng chúng tôi bao gồm một câu nói: “an uncoupled client is a happy client” (Một client bóc biệt up load là một client hạnh phúc).

Decorator: Dễ thương thơm đấy. Đừng cho rằng công ty chúng tôi có được tất cả vinc quang; nhiều khi tôi chỉ là 1 trong decorator đang được bảo phủ bởi vì những người dân biết bao gồm từng nào decorator khác. khi một cuộc Điện thoại tư vấn cách làm được ủy quyền cho chính mình, bạn sẽ đắn đo gồm bao nhiêu decorator không giống sẽ xử lý nó với các bạn chần chừ rằng các bạn sẽ được chăm chú vì chưng đông đảo nỗ lực cố gắng của doanh nghiệp phục vụ đề xuất.

Adapter: Này, trường hợp những adapter đã có tác dụng công việc của mình, client của công ty chúng tôi thậm chí còn ko khi nào biết công ty chúng tôi sẽ sống đó. Nó có thể là một công việc bội bạc.

Nhưng, điều hoàn hảo nhất về adapter của chúng tôi là Shop chúng tôi chất nhận được client thực hiện những thư viện cùng tập vừa lòng bé new mà ko đổi khác bất kỳ đoạn code như thế nào, họ chỉ phụ thuộc vào chúng tôi nhằm triển khai đổi khác mang lại họ. Này, nó là một phần nhỏ dại, tuy nhiên công ty chúng tôi khôn cùng giỏi về nó.

Decorator: Các decorator của công ty chúng tôi cũng có tác dụng điều ấy, chỉ Cửa Hàng chúng tôi cho phép hành vi new được cung cấp những lớp mà ko biến đổi code hiện tất cả. Tôi vẫn bảo rằng những adapter chỉ là gần như decorator “kỳ lạ mắt” – ý tôi là, y như Cửa Hàng chúng tôi, bạn cũng bảo phủ một object.

Adapter: Không, ko, không, không thể. Chúng tôi luôn luôn đổi khác interface của những gì Cửa Hàng chúng tôi bọc bên phía trong, bạn không khi nào có tác dụng vấn đề này. Tôi bảo rằng một decorator giống hệt như một adapter; chỉ với các bạn không đổi khác giao diện!

Decorator: À, không. Công câu hỏi của công ty chúng tôi vào cuộc sống là mở rộng những hành vi hoặc trách nhiệm của những đối tượng người dùng Shop chúng tôi quấn, Cửa Hàng chúng tôi không hẳn là một “mẫu mã đơn giản dễ dàng nhằm hiểu” (simple pass through)..

Adapter: Này, ai đang Gọi ai là “chủng loại đơn giản và dễ dàng nhằm hiểu”? Xem tiếp với chúng ta vẫn thấy chúng ta thay đổi một vài ba đồ họa vào bao lâu!

Decorator: Có lẽ chúng ta yêu cầu chấp nhận hay không đồng ý. Chúng ta có thể trông hơi tương tự nhau trên giấy tờ, nhưng mà rõ ràng bọn họ phương pháp cách nhau vào dự định của bọn họ.

Xem thêm: Typical Japanese Là Gì - Ie (Japanese Family System)

Adapter: Ồ vâng, tôi gật đầu cùng với các bạn.

(còn nữa...phần 2).

Link kèm theo bạn dạng nơi bắt đầu của quyển sách:Head First Design Patterns.Link đi kèm sourcecode của sách:Tải SourceCode.