導航:首頁 > 編程語言 > 裝飾者模式php

裝飾者模式php

發布時間:2022-07-29 21:48:16

❶ 裝飾器模式解決什麼問題

裝飾者模式(Decorator Pattern),是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
使用裝飾者模式的時候需要注意一下幾點內容:
(1)裝飾對象和真實對象有相同的介面。這樣客戶端對象就可以以和真實對象相同的方式和裝飾對象交互。
(2)裝飾對象包含一個真實對象的引用。
(3)裝飾對象接受所有的來自客戶端的請求,它把這些請求轉發給真實的對象。
(4)裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。然而,裝飾者模式,不需要子類可以在應用程序運行時,動態擴展功能,更加方便、靈活。

適用裝飾者模式場合:
1.當我們需要為某個現有的對象,動態的增加一個新的功能或職責時,可以考慮使用裝飾模式。
2.當某個對象的職責經常發生變化或者經常需要動態的增加職責,避免為了適應這樣的變化,而增加繼承子類擴展的方式,因為這種方式會造成子類膨脹的速度過快,難以控制。

推薦你一本設計模式方面的優秀書籍:鄭阿奇 主編的《軟體秘笈-設計模式那點事》。裡面講解很到位,實例通俗易懂,看了收獲很大!

祝你早日學會設計模式!

❷ 你熟悉的設計模式有哪些寫出單例模式的實現代碼

23個設計模式:

根據目的設計模式可以分為創造模式,結構模式和行為模式,創建模式用於處理對象的創建。結構模式用於處理類或對象的組合。

行為模式用於描述類或對象如何交互以及如何分配職責,創建模式用於處理對象的創建。主要包括以下五種設計模式:

工廠方法模式()

抽象工廠模式(AbstractFactoryPattern)

建造者模式(BuilderPattern)

原型模式(PrototypePattern)

單例模式(SingletonPattern)

結構模式用於處理類或對象的組合,包括以下七個設計模式:

適配器模式(AdapterPattern)

橋接模式(BridgePattern)

組合模式(CompositePattern)

裝飾者模式(DecoratorPattern)

外觀模式(FacadePattern)

享元模式(FlyweightPattern)

代理模式(ProxyPattern)

行為模式描述類或對象如何交互以及它們如何分配職責。它由以下11種設計模式組成:

責任鏈模式(Chain的ResponsibilityPattern)

命令模式(CommandPattern)

解釋器模式(InterpreterPattern)

迭代器模式(IteratorPattern)

中介者模式(MediatorPattern)

備忘錄模式(MementoPattern)

觀察者模式(ObserverPattern)

狀態模式(StatePattern)

策略模式(StrategyPattern)

模板方法模式(TemplateMethodPattern)

訪問者模式(VisitorPattern)

單例模式實現1:

公共類Singleton{

類共享實例對象

私有靜態單例;單例=零;

//私有構造函數

私有Singleton(){

系統。出去了。這是單例!!);

//獲取單例方法

公共同步靜態單例getInstance(){

//確定共享對象是否為空,如何空一個新對象

If(singleton==null){

singleton=newsingleton();

返回單例。

單例模式實現2:

公共類Singleton{

類共享實例對象實例化

=newSingleton();

//私有構造函數

私有Singleton(){

系統:出去了,這是單例!!);

//獲取單例方法

公共靜態單例getInstance(){

直接返回共享對象

返回單例。

(2)裝飾者模式php擴展閱讀:

注意事項:

設計模式主要分三個類型:創建型和行為型。

Singleton:確保一個類只有一個實例,並為其提供一個全局訪問點

AbstractFactory:提供一個介面,用於創建一系列相關或相互依賴的對象,而無需指定它們的具體類。

FactoryMethod:定義一個用於創建對象的介面,並讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類。

Builder:將復雜對象的構造與其表示分離,使相同的構造過程可以創建不同的表示。

Prototype:指定要使用Prototype實例創建的對象的類型,並復制該原型來創建一個新對象。

Composite:將對象組合成樹狀結構,以表示整體各部分之間的關系。組合使用戶一致地使用單個對象和組合對象。

Facade:為子系統fa中的一組介面提供一致的介面。Ade提供了一個高級介面,使子系統更易於使用。

Proxy:為其他對象提供一個代理,以控制對該對象的訪問

Adapter:將一個介面類轉換為客戶想要的另一個介面類。適配器模式使那些由於介面不兼容而無法一起工作的類一起工作。

Decrator:式比子類化更靈活,可以為對象動態添加一些額外的職責。

Bridge:模式將抽象部分與其實現部分分離,以便它們可以獨立地更改。

Flyweight:享元模式

java問題 想問下 裝飾者模式有什麼實際用途呢能舉個實際應用的例子嗎

裝飾者模式用來擴展對象的功能,給對象添加不同的功能。在io流中,比如 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/text.txt")))); 這種對File類的包裝,由內層到外層擴展輸入流的功能,就是一個典型的裝飾者模式。inputstream是被裝飾對象,然後Fileinputstream、InputStream、BufferedReader都是它的裝飾器,用來擴展它的功能!

❹ Java 代理模式和裝飾者模式的區別

您好!
代理模式與裝飾者模式看起來很像,都實現基礎對象實現的介面,在其自身對象中都保存著對被代理/被裝飾者的對象引用。
先來看看裝飾者模式的定義:動態的將責任附加到被裝飾者對象上,用於擴展對象的功能。比繼承的靈活性大。典型的如Java IO的設計即是裝飾者模式的典型應用。
代理模式模式的定義:對其他對象進行代理,以控制對被代理對象的訪問。Spring的為業務邏輯層方法生成的代理類,主要進行一些事務控制等。
由定義可以看出裝飾的責任是擴展功能 ,而代理主要控制訪問。
具體例子可參看Java IO裝飾/Spring的動態代理/Hibernate的代理等。
望採納

❺ PHP中幾種常見的開發模式

單例模式

❻ 開發中用到哪些設計模式 用在什麼場合

一共23種設計模式!

引用《軟體秘笈-設計模式那點事》書籍:

按照目的來分,設計模式可以分為創建型模式、結構型模式和行為型模式。
創建型模式用來處理對象的創建過程;結構型模式用來處理類或者對象的組合;行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述。

創建型模式用來處理對象的創建過程,主要包含以下5種設計模式:
 工廠方法模式(Factory Method Pattern)
 抽象工廠模式(Abstract Factory Pattern)
 建造者模式(Builder Pattern)
 原型模式(Prototype Pattern)
 單例模式(Singleton Pattern)

結構型模式用來處理類或者對象的組合,主要包含以下7種設計模式:
 適配器模式(Adapter Pattern)
 橋接模式(Bridge Pattern)
 組合模式(Composite Pattern)
 裝飾者模式(Decorator Pattern)
 外觀模式(Facade Pattern)
 享元模式(Flyweight Pattern)
 代理模式(Proxy Pattern)

行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述,主要包含以下11種設計模式:
 責任鏈模式(Chain of Responsibility Pattern)
 命令模式(Command Pattern)
 解釋器模式(Interpreter Pattern)
 迭代器模式(Iterator Pattern)
 中介者模式(Mediator Pattern)
 備忘錄模式(Memento Pattern)
 觀察者模式(Observer Pattern)
 狀態模式(State Pattern)
 策略模式(Strategy Pattern)
 模板方法模式(Template Method Pattern)
 訪問者模式(Visitor Pattern)

詳情請參考書籍《軟體秘笈:設計模式那點事》,該書中詳細講解了各種設計模式的使用場合,裡面講解設計模式例子也很生動,容易理解,還有JDK中設計模式應用情況,看了收獲挺大的!好東西大家一起分享!
祝你早日學會設計模式!

❼ 關於java中裝飾者模式的詳解,不理解啊,,誰給解釋解釋。。。

DataInputStreambis=newDataInputStream(newBufferedInputStream(newFileInputStream("File")));
BufferedInputStreambis2=newBufferedInputStream(newDataInputStream(newFileInputStream("File")));

BufferedInputStream添加了緩沖功能,請問,bis還有緩沖功能么?bis現在是DataInputStream類型的,bis2才是BufferedInputStream類型的,這是我學些IO的一個問題,為什麼bis還有緩沖功能?






問題:動態給一個對象添加一些額外的職責

思考:可以修改這個類的源代碼嗎?

回答:可以

思考:那直接修改源代碼就行了

問題:如果不可以修改呢?

思考:如果不可以修改源代碼,那怎麼添加?

回答:有一些類庫可以直接修改編譯後的class文件,但是這里不考慮

可以直接包含這個類的對象,如果這個類有實現某些介面,剛好某個需要添加額外智能的方法正好是其中一個方法,那就好辦了

Son這個類的paint()方法需要添加一些額外的功能

packagedecorator;
publicclassSonimplementsWork{
publicvoidpaint(){
System.out.println("兒子用鉛筆畫好了一幅畫。");
}
}

這個類不是實現了Work方法嗎?那就好辦了,新建一個類,繼承Work介面:

packagedecorator;
{
//被裝飾者
privateWorkwork;

publicMother(Workwork){
this.work=work;
}

privateMother(){}
publicvoidpaint(){

//媽媽裝飾者做的職責
System.out.println("媽媽正在做給畫上顏色前的准備工作。");

//被裝飾者做的職責
work.paint();

//媽媽裝飾者做的職責
System.out.println("媽媽給畫上好了顏色。");
}
}

那個所謂的Work介面:

packagedecorator;
publicinterfaceWork{
publicvoidpaint();
}

你不是想讓Son可以的paint方法多做點工作么?那我new出Mother類執行paint方法不就可以了嗎



看代碼就知道,其實這個裝飾器模式並不怎麼好用,每個需要裝飾的類或者需要繼承某個介面,這實在是一個限制


網上找的資料:

裝飾模式(Decorator)

裝飾模式又名包裝(Wrapper)模式。

裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案。

裝飾模式通過創建一個包裝對象,也就是裝飾,來包裹真實的對象。

裝飾模式以對客戶端透明的方式動態地給一個對象附加上更多的責任。換言之,客戶端並不會覺得對象在裝飾前和裝飾後有什麼不同。

裝飾模式可以在不創造更多子類的情況下,將對象的功能加以擴展。

裝飾模式把客戶端的調用委派到被裝飾類。裝飾模式的關鍵在於這種擴展是完全透明的。

裝飾模式的角色

抽象構件角色(Component):給出一個抽象介面,以規范准備接收附加責任的對象。

具體構件角色(Concrete Component):定義將要接收附加責任的類。

裝飾角色(Decorator):持有一個構件(Component)對象的引用,並定義一個與抽象構件介面一致的介面。

具體裝飾角色(Concrete Decorator):負責給構件對象「貼上」附加的責任。

Java IO中的裝飾模式

在IO中,具體構件角色是節點流,裝飾角色是過濾流。

FilterInputStream和FilterOutputStream是裝飾角色,而其他派生自它們的類則是具體裝飾角色。

裝飾模式的特點

裝飾對象和真實對象有相同的介面。這樣客戶端對象就可以以和真實對象相同的方式和裝飾對象交互。

裝飾對象包含一個真實對象的引用(reference)。

裝飾對象接收所有來自客戶端的請求,它把這些請求轉發給真實的對象。

裝飾對象可以在轉發這些請求之前或之後附加一些功能。

這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。

程序實例

publicinterfaceComponent
{
publicvoiddoSomething();

}

這是抽象構件角色,是一個介面。具體構件角色實現這個介面:


{

@Override
publicvoiddoSomething()
{
System.out.println("功能A");
}

}

裝飾角色:


{
privateComponentcomponent;

publicDecorator(Componentcomponent)
{
this.component=component;
}

@Override
publicvoiddoSomething()
{

component.doSomething();
}

}

其中包含了構件角色的引用,方法調用中利用構件角色的方法。

具體裝飾角色(兩個):


{
publicConcreteDecorator1(Componentcomponent)
{
super(component);
}

@Override
publicvoiddoSomething()
{
super.doSomething();

this.doAnotherThing();
}

privatevoiddoAnotherThing()
{
System.out.println("功能B");
}

}

{
publicConcreteDecorator2(Componentcomponent)
{
super(component);
}
@Override
publicvoiddoSomething()
{
super.doSomething();

this.doAnotherThing();
}

privatevoiddoAnotherThing()
{
System.out.println("功能C");
}

}

使用測試:

publicclassClient
{
publicstaticvoidmain(String[]args)
{
Componentcomponent=newConcreteComponent();

Componentcomponent1=newConcreteDecorator1(component);

component1.doSomething();
System.out.println("-----------");

Componentcomponent2=newConcreteDecorator2(component1);

component2.doSomething();
}

}

輸出:

功能A
功能B
-----------
功能A
功能B
功能C

❽ 編程裡面的設計模式到底有多少種誰能詳細告訴我~謝謝

一共23種設計模式!

按照目的來分,設計模式可以分為創建型模式、結構型模式和行為型模式。
創建型模式用來處理對象的創建過程;結構型模式用來處理類或者對象的組合;行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述。

創建型模式用來處理對象的創建過程,主要包含以下5種設計模式:
 工廠方法模式(Factory Method Pattern)
 抽象工廠模式(Abstract Factory Pattern)
 建造者模式(Builder Pattern)
 原型模式(Prototype Pattern)
 單例模式(Singleton Pattern)

結構型模式用來處理類或者對象的組合,主要包含以下7種設計模式:
 適配器模式(Adapter Pattern)
 橋接模式(Bridge Pattern)
 組合模式(Composite Pattern)
 裝飾者模式(Decorator Pattern)
 外觀模式(Facade Pattern)
 享元模式(Flyweight Pattern)
 代理模式(Proxy Pattern)

行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述,主要包含以下11種設計模式:
 責任鏈模式(Chain of Responsibility Pattern)
 命令模式(Command Pattern)
 解釋器模式(Interpreter Pattern)
 迭代器模式(Iterator Pattern)
 中介者模式(Mediator Pattern)
 備忘錄模式(Memento Pattern)
 觀察者模式(Observer Pattern)
 狀態模式(State Pattern)
 策略模式(Strategy Pattern)
 模板方法模式(Template Method Pattern)
 訪問者模式(Visitor Pattern)

推薦你一本好書:《軟體秘笈:設計模式那點事》,裡面講解的23中設計模式例子很生動,容易理解,還有JDK中設計模式應用情況,看了收獲挺大的!網路裡面搜「設計模式」,第一條中設計模式網路中就有首推該圖書,瀏覽量在20幾萬以上的,不會錯的。好東西大家一起分享!
祝你早日學會設計模式!

❾ 設計模式 大全

觀察者模式,裝飾者模式,工廠模式,單件模式,命令模式,適配器模式與外觀模式,模板方法模式,送代器與組合模式,狀態模式,代理模式,復合模式

閱讀全文

與裝飾者模式php相關的資料

熱點內容
如何上網上設個人加密賬戶 瀏覽:44
linux打開ssh服務 瀏覽:78
微信位置可以加密嗎 瀏覽:470
演算法蠻力法 瀏覽:438
隨機排練命令 瀏覽:147
python多進程並發 瀏覽:41
安卓軟體安裝如何躲避安全檢測 瀏覽:647
奇幻潮翡翠台源碼百度雲盤 瀏覽:187
什麼軟體可以免費pdf轉word 瀏覽:15
php正則表達式大全 瀏覽:394
androidntp時間 瀏覽:299
輪機長命令簿英文 瀏覽:148
oppo鈴聲設置被加密怎麼處理 瀏覽:548
粵苗app圖形驗證碼怎麼填 瀏覽:899
管家婆架設雲伺服器 瀏覽:254
php的登錄界面代碼 瀏覽:997
php開發客戶端 瀏覽:998
theisle測試服怎麼搜伺服器 瀏覽:447
廣播PDF 瀏覽:218
單片機編程300例匯編百度 瀏覽:35