大話設計模式筆記(四)——裝飾模式

  • 2019 年 10 月 30 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/luo4105/article/details/76546343

第六章裝飾模式

裝飾模式是動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。

裝飾模式UML

裝飾模式的核心是對對象不斷添加裝飾的功能所使用的設計模式。

現有需求人和多種衣服,人需要自主搭配多種衣服,UML結構圖如下

在上面的UML中,Decoiator存在Component對象屬性,在構造器初始化。它的子類的wear方法會調用component.wear();這樣實現Decoiator的子類去裝飾Person類。

程式碼

Componet

public abstractclass Componet {        public abstract void wear();  }

Person

public class Person extends Componet{      private Stringname = "小菜";        @Override      public void wear() {          System.out.println(name+ "穿衣");      }  }

Decorator

public class Decorator extends Componet {        public Componet componet;        public Decorator(Componet componet) {          this.componet = componet;      }        @Override      public void wear() {          componet.wear();      }  }

JeansDecorator

public class JeansDecorator extends Decorator {        public JeansDecorator(Componet componet) {          super(componet);      }        @Override      public void wear() {          super.wear();          System.out.println("穿牛仔褲");      }  }

TieDecorator

public class TieDecorator extends Decorator {        public TieDecorator(Componet componet) {          super(componet);      }        @Override      public void wear() {          super.wear();          System.out.println("打領帶");      }  }

TShirtDecorator

public class TShirtDecorator extends Decorator {        public TShirtDecorator(Componet componet) {          super(componet);      }        @Override      public void wear() {          super.wear();          System.out.print("穿T恤");      }  }

Test

public class Test {      public static void main(String[] args) {          Decorator tie = new TieDecorator(new Person());          Decorator jeans = new JeansDecorator(tie);          Decorator tshirt = new TShirtDecorator(jeans);            tshirt.wear();      }  }

列印

小菜穿衣

打領帶

穿牛仔褲

穿T恤

總結

裝飾模式是給核心功能添加新的功能,並能按照順序執行。裝飾模式將特定方法封裝到類中,並讓這個類包裝它所需要的裝飾類對象,因此,當需要執行特殊行為時,客戶程式碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能包裝對象了。

裝飾者模式是應用最普遍的設計模式之一。javaAPI中對裝飾者模式的舉例:Java I/O 庫中 BufferedInputStream、DataInputStream、LineNumberInputStream、PushbackInputStream 等裝飾者類對於 InputStream 的封裝;JavaEE API 中的 ServletRequestWrapper、HttpServletRequestWrapper 對於 ServletRequest 的封裝