---
# System prepended metadata

title: Decorator
tags: [Decorator, Design Patten]

---

# Decorator
###### tags: `Design Patten` `Decorator`
**裝飾者模式**的使用時機為，當你想要**增加類別的功能**，但不想修改到現有類別的程式碼；或是要動態地添加新功能於類別上；或是該類別搭配不同的特性會有多種組合的情況。

在Java中使用裝飾者模式的典型例子為`Java IO`，其抽像類別`InputStream`的抽象方法read()分別由不同的裝飾者類別如`BufferedInputStream`，`ObjectInputStream`，`DataInputStream`等來實作各種讀取串流(stream)的方法並提供額外的功能。而每一裝飾類別的建構式皆以其父抽像類別`InputStream`為輸入參數。

修飾模式與代理模式差異
代理模式 : 著重於對一個類`存取`，只能透過代理來間接使用，在代理模式中通常會建立一個物件實例
修飾模式 : 著重於在一個物件上`動態增加方法`，在修飾模式中會將原始物件透過修飾器的建構子傳遞
