java設計形式之裝潢形式具體引見。本站提示廣大學習愛好者:(java設計形式之裝潢形式具體引見)文章只能為提供參考,不一定能成為您想要的結果。以下是java設計形式之裝潢形式具體引見正文
1. 裝潢形式(Decorator)的界說:別名包裝(Wrapper)形式,裝潢形式以對客戶端通明的方法擴大對象的功效,是繼續關系的一個替換計劃。
2. 裝潢形式以對客戶端通明的方法靜態的給一個對象附加上更多的義務。換言之客戶端其實不會覺的對象在裝潢前和裝潢後有甚麼差別。
3. 裝潢形式可以在不發明更多的子類的形式下,將對象的功效加以擴大。
4. 裝潢形式與類繼續的差別:
1) 裝潢形式是一種靜態行動,對曾經存在類停止隨便組合,而類的繼續是一種靜態的行動,一個類界說成甚麼樣的,該類的對象便具有甚麼樣的功效,沒法靜態的轉變。
2) 裝潢形式擴大的是對象的功效,不須要增長類的數目,而類繼續擴大是類的功效,在繼續的關系中,假如我們想增長一個對象的功效,我們只能經由過程繼續關系,在子類中增長兩個辦法。
3) 裝潢與繼續比擬圖:
4) 裝潢形式是在不轉變原類文件和應用繼續的情形下,靜態的擴大一個對象的功效,它是經由過程創立一個包裝對象,也就是裝潢來包裹真是的對象。
5. 裝潢形式把對客戶真個挪用委派給被裝潢的類,裝潢形式的症結在於這類擴大完整通明的。
6. 裝潢形式的組成:
1) 籠統構建腳色(Component):給出一個籠統的接口,以標准預備接收附加義務的對象。相當於i/o流外面InputStream/OutputStream和Reader/Writer。
2) 詳細的構建腳色(ConcreteComponent):界說一個將要接收附加義務的類。相當於i/o外面的FileOutputStream和FileInputStream。
3) 裝潢腳色(Docorator):持有一個籠統構建(Component)腳色的援用,並界說一個與籠統構件分歧的接口。相當於i/o外面的FilerOutputStream和FilterInputStream。
4) 詳細的裝潢腳色(ConcreteDecorator):擔任給構建對象“貼上”附加的義務。相當於i/o流外面的BufferedOutputStream和BufferedInputStream和DataOutputStream和DataInputSrtream。
7. 裝潢形式的特色:
1) 裝潢對象和真實對象具有雷同的接口,如許客戶端對象便可以以真實對象的雷同的方法和裝潢對象交互。
2) 裝潢對象包括一個真實對象的援用(reference).
3) 裝潢對象接收一切來自客戶真個要求,它把這些要求轉發給真實的對象。
4) 裝潢對象可以在轉發這些要求之前或許今後增長一些附加的功效。如許就可以確保在運轉時,不消修正給定對象構造便可以在內部增長附加的功效。在面向對象的法式設計中,平日是應用繼續的關系來擴大給定類的功效。
8. 案例:
1) 籠統的構建接口:
packagecom.abao.decorate;
public interface Component
{
public void doSomething();
}
2) 詳細的構建腳色:
packagecom.abao.decorate;
public class ConcreteComponent implements Component
{
@Override
public void doSomething()
{
System.out.println("功效A");
}
}
3) 裝潢腳色:
packagecom.abao.decorate;
public class Decorate implements Component
{
private Component component;
public Decorate(Component component)
{
this.component = component;
}
@Override
public void doSomething()
{
component.doSomething();
}
}
4) 詳細裝潢腳色1:
packagecom.abao.decorate;
public class ConcreteDecorate1 extends Decorate
{
public ConcreteDecorate1(Component component)
{
super(component);
}
@Override
public void doSomething()
{
super.doSomething();
this.doAnotherDosomething();
}
private void doAnotherDosomething()
{
System.out.println("功效B");
}
}
5) 詳細裝潢腳色2:
packagecom.abao.decorate;
public class ConcreteDecorate2 extends Decorate
{
public ConcreteDecorate2(Component component)
{
super(component);
}
@Override
public void doSomething()
{
super.doSomething();
this.doAnotherDosomething();
}
private void doAnotherDosomething()
{
System.out.println("功效C");
}
}
6) 客戶端
packagecom.abao.decorate;
public class Client
{
public static void main(String[] args)
{
Component component = new ConcreteDecorate1(
new ConcreteDecorate2(new ConcreteComponent()));
component.doSomething();
}
}
9. 完!