PHP設計模式之裝飾器模式,委託模式,外觀模式

2021-06-02 08:24:28 字數 4533 閱讀 4407

如果已有物件的部分內容或功能發生改變,但是不修改原始物件的結構,也不使用擴充套件類時,可以使用裝飾器模式。

class cd

public function addtrack($track) //向cd中新增一首歌

public function gettracklist()";}

return $output;}}

呼叫時:

$trackextends=array('over my head','wake me up','faint');

$mycd=new cd();

foreach($arrayextends as $track)

$mycd->addtrack($track);

現在功能要把track的名字變為大寫,在不修改原類和不使用繼承的情況下,使用裝飾器模式

class cddecorator

public function makecaps

}再次呼叫時:

$arrayextends=array('over my head','wake me up','faint');

$mycd=new cd();

foreach($arrayextends as $track)

$mycd->addtrack($track);

$mycddecorator=new cddecorator($mycd);

$mycddecorator->makecaps();            //完成了對cd中track變大寫的功能

把要裝飾的物件的乙個例項作為裝飾類的私有物件,進行加工處理,得到需要的功能

通過分配或委託至其它物件,委託設計模式能夠去除核心物件中的條件判斷和複雜的功能性。

class playlist

public function addsong($location,$title)

public function getm3u()

public function getpls()

}呼叫時:

$playlist=new playlist();

$playlist->addsong('/music/taylor/1.***,'you belong with me'');

$playlist->addsong('/music/linkin/6.***,'*****cut'');

if($externalretrievedtype=='pls')

$playlistcontent=$playlist->getpls();

else

$playlistcontent=$playlist->getm3u();

可以看到現在只有兩種可以判斷,如果之後再新增新的分類,更改維護起來會很麻煩

下面用委託模式來解決:

class newplaylist

playlist";

$this->__typeobject=new $object;

}public function addsong($location,$title)

public function getplaylist()

}下面構造每個種類的委託類

class m3uplaylistdelegate

}class plsplaylistdelegate

}呼叫時:

$extype='pls';

$playlist=new newplaylist($extype);

$content=$playlist->getplaylist();

這樣,當增加新的型別時,開發人員不用修改上面的**,只需要再寫乙個新的委託類就能完成功能。

委託模式去除了核心物件的複雜性並且能夠動態新增新的功能。

在應用程序中的乙個步驟抱恨許多複雜的邏輯步驟和方法呼叫時,建立乙個機遇外觀模式的物件

外觀模式隱藏了來自呼叫物件的複雜性

class cd

class cduppercase

class cdmakexml

之所以不把這兩個類實現的功能直接加入cd類中,而是單獨建類時為了之後重用方便著想。

呼叫時:

cduppercase::makestring($cd,'title');

cduppercase::makestring($cd,'band');

print cdmakexml::create($cd);

用外觀模式來實現:

class webservicefacade

$xml=cdmakexml::create($cd);

return $xml;

} 如果已有物件的部分內容或功能發生改變,但是不修改原始物件的結構,也不使用擴充套件類時,可以使用裝飾器模式。

class cd

public function addtrack($track) //向cd中新增一首歌

public function gettracklist()";}

return $output;}}

呼叫時:

$trackextends=array('over my head','wake me up','faint');

$mycd=new cd();

foreach($arrayextends as $track)

$mycd->addtrack($track);

現在功能要把track的名字變為大寫,在不修改原類和不使用繼承的情況下,使用裝飾器模式

class cddecorator

public function makecaps

}再次呼叫時:

$arrayextends=array('over my head','wake me up','faint');

$mycd=new cd();

foreach($arrayextends as $track)

$mycd->addtrack($track);

$mycddecorator=new cddecorator($mycd);

$mycddecorator->makecaps();            //完成了對cd中track變大寫的功能

通過分配或委託至其它物件,委託設計模式能夠去除核心物件中的條件判斷和複雜的功能性。

class playlist

public function addsong($location,$title)

public function getm3u()

public function getpls()

}呼叫時:

$playlist=new playlist();

$playlist->addsong('/music/taylor/1.***,'you belong with me'');

$playlist->addsong('/music/linkin/6.***,'*****cut'');

if($externalretrievedtype=='pls')

$playlistcontent=$playlist->getpls();

else

$playlistcontent=$playlist->getm3u();

可以看到現在只有兩種可以判斷,如果之後再新增新的分類,更改維護起來會很麻煩

下面用委託模式來解決:

class newplaylist

playlist";

$this->__typeobject=new $object;

}public function addsong($location,$title)

public function getplaylist()

}下面構造每個種類的委託類

class m3uplaylistdelegate

}class plsplaylistdelegate

}呼叫時:

$extype='pls';

$playlist=new newplaylist($extype);

$content=$playlist->getplaylist();

這樣,當增加新的型別時,開發人員不用修改上面的**,只需要再寫乙個新的委託類就能完成功能。

委託模式去除了核心物件的複雜性並且能夠動態新增新的功能。

在應用程序中的乙個步驟抱恨許多複雜的邏輯步驟和方法呼叫時,建立乙個機遇外觀模式的物件

外觀模式隱藏了來自呼叫物件的複雜性

class cd

class cduppercase

class cdmakexml

之所以不把這兩個類實現的功能直接加入cd類中,而是單獨建類時為了之後重用方便著想。

呼叫時:

cduppercase::makestring($cd,'title');

cduppercase::makestring($cd,'band');

print cdmakexml::create($cd);

用外觀模式來實現:

class webservicefacade

$xml=cdmakexml::create($cd);

return $xml;

}

php設計模式之裝飾器模式

裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比 繼承更有彈性的替代方案。有這樣乙個專案,做乙個餐廳訂餐系統。起初的 結構是這樣的。前面有很多beverage的繼承類,現在遇到的問題是牛奶的價錢 了,那麼所有相關的類,我們都要進行調整,比如milk,sugarandmilk類,這...

PHP設計模式之裝飾器模式

修飾模式,是物件導向程式設計領域中,一種動態地往乙個類中新增新的行為的設計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個物件而不是整個類新增一些功能。將所有的功能建立在繼承體系上會導致系統中的類越來越多,而且當你又要修改他們的分支的時候,可能還會出現重複 我們來看下面這個例子,為了計...

php設計模式之裝飾器模式

裝飾器模式 可以動態的新增,修改某乙個類的功能 特點 1 建立乙個可以被其他類可以實現的類 2 建立乙個功能類去實現剛才定義的類 發現 裝飾器模式與觀察者模式,介面卡模式,這幾種模式存在著一定的相似關係 定義乙個可以實現的類 inte ce decorator public function aft...