天天看點

Java設計模式之擴充卡模式和外觀模式

擴充卡模式

所謂擴充卡模式,将一個類的接口,轉換為客戶所期望的另一個接口。擴充卡讓原本接口不相容的類可以合作無間。

擴充卡主要組成包括:

目标接口:用戶端所希望得到的接口

擴充卡:這個主要就是将被擴充卡轉換為目标接口,一般要實作目标接口,且包含被配飾器成員

被擴充卡:也就是用來改造的,提供給擴充卡來轉換的,通常要将該被擴充卡綁定傳入到擴充卡中,讓擴充卡得以轉換。

一般這種模式就是在不修改現有代碼的情況下,将一個接口轉換為另一個接口。它主要包含兩種方式:

對象擴充卡:

這種就是在擴充卡中利用了組合來處理,将被擴充卡作為擴充卡的一個成員屬性,而且擴充卡則就實作或者繼承客戶所需要的目标接口

代碼執行個體:

假如有一個小狗和小貓的兩個接口,現在客戶需要小貓,可是隻有小狗接口,則就可以利用擴充卡來轉換。

這裡隻寫出擴充卡代碼:

package test;

publicclass AnimalAdapter implements Cat{

private Dog dog;//被擴充卡

public AnimalAdapter(Dog dog)

{

this.dog=dog;

}

publicvoid mimi() {

dog.wow();

publicvoid run() {

dog.run();

publicvoid sleep() {

dog.sleep();

外觀模式

所謂外觀模式,就是提供一個統一接口,用來通路子系統中的一群接口。它定義了一個高層接口,讓子系統更容易使用。

外觀模式并沒有封裝了子系統的類,外觀隻是提供了更簡化的接口,它裡面仍然包含着子系統中各個接口的對象,并且利用組合将子系統的所有接口來包含起來。它不僅提供了一個簡化接口,而且依然将系統完整的功能暴露出來。

假設你要回家,回家進入屋裡有各種各樣的操作,此時就可以将這一系列操作看着一個子系統。可以簡化該所有操作。

import com.whut.command.Light;

publicclass Facede {

//等各種子系統的操作

private Light light;

private Door door;

private Window window;

publicvoid goHome()

light.on();

door.open();

window.open();

擴充卡模式将一個或者多個類接口變成客戶所期望的接口,并不是轉換一個接口。

外觀模式也可以隻針對一個擁有複雜接口的類提供簡化的接口。

擴充卡模式設計的意圖主要就是讓現有接口改變成符合顧客所期望的接口

外觀模式的意圖就是将一個複雜的子系統的所有接口簡化,以提供一個便利友善的接口來給客戶

設計模式原則:

最少知識原則,減少對象之間的互動,隻留下幾個“密友”。

要想遵循這個原則一般我們應該隻調用屬于以下範圍的方法:

1 該對象的本身

2 被當做方法的參數而傳遞進來的對象

3 此方法所建立或執行個體化的任何對象

4 對象的任何元件,即該對象内部的所有成員變量或者方法

不要調用當某對象是調用其他方法後傳回的結果。

兩個模式總結:

1)當需要使用一個現有的類但是其接口并不符合你的需要時,可以用擴充卡模式

2)當需要簡化并且統一一個很大的接口或者一群複雜的接口時候

3)擴充卡改變接口以使其符合客戶的期望

4)外觀将客戶從一個複雜的子系統中解耦

5)擴充卡将一個對象包裝起來以改變其接口。

裝飾者将一個對象包裝起來用來增加新的行為和責任。外觀将一群對象包裝起來以簡化其接口。

本文轉自 zhao_xiao_long 51CTO部落格,原文連結:http://blog.51cto.com/computerdragon/1165985