ทำไมต้องใช้ Decorator Pattern
- อยากเพิ่มความสามารถของ Object (Object ทำงานเหมือนเดิมนะ แต่ถูกเพิ่มความสามารถ)
เมื่อไหร่ควรจะใช้
- ไม่อยากใช้คุณสมบัตินึงของ OOP-Inheritance มากเกินไป เพราะใช้ไปแล้ว ก็ต้อง Override ไปแก้ความสามารถที่ได้มาจาก Class แม่อีก หรือมี Class ลูก (Sub Class) ที่มากจนเกินไปครับ ซึ่งเจ้า Decorator มันมาช่วยตรงนี้ครับ ไม่ต้องแก้ แต่เราเพิ่ม (Wrap) ความสามารถใหม่ลงไป โดยที่ความสามารถเดิม ยังคงอยู่ ลดจำนวน Sub Class ลงได้
- สนับสนุนแนวคิด Open-Close Principle ด้วย
Open for Extension Closed for Modification
- Note: ไม่บอกว่าห้ามใช้ Inheritance นะครับ ใช้ให้มันพอดี ^__^
Pattern มันเป็นอย่างไร - Class Diagram
- Template
- ตัวอย่าง
มุมมองตอน Runtime - Object Diagram
- ลักษณะของ Object หลังถูก Create
มุมมองลำดับการทำงาน - Sequence Diagram
- ตอนสร้าง Object
- ตอนคำนวณราคา
Real World Example
- Java.IO Class ไง มีการเพิ่มความสามารถจาก
- FileInputStream
- BufferedInputStream
- UpperCaseInputStream - สร้างเอง
- BufferedInputStream
- FileInputStream
- Code ของ Class UpperCaseInputStream เสริมความสามารถมาจาก FilterInputStream
import java.io.*; public class UpperCaseInputStream extends FilterInputStream { public UpperCaseInputStream(InputStream in) { super(in); } public int read() throws IOException { int c = super.read(); return (c == -1 ? c : Character.toUpperCase((char)c)); } public int read(byte[] b, int offset, int len) throws IOException { int result = super.read(b, offset, len); for (int i = offset; i < offset+result; i++) { b[i] = (byte)Character.toUpperCase((char)b[i]); } return result; } }
- มาดู Code กันดีว่า ว่าเพิ่มความสามารถอย่างไร ? - อ่าน TestFile ซึ่ง FileInputStream มันอ่านที่ได้ละ 1 byte / โดยให้อ่านมาเป็น Stream ที่ละ 8192 byte ใช้ BufferedInputStream ลด Operation ที่แสนหนักหน่วงไป และอ่านให้แปลงตัวอีกษรให้เป็นตัวพิมพ์ใหญ่ (UpperCase) จาก UpperCaseInputStream
public class SampleDecoratorTest { public static void main(String[] args) throws IOException { int char; try { InputStream in = new UpperCaseInputStream(new BufferedInputStream(new FileInputStream(“DecoratorTest.txt”))); while((char = in.read()) >= 0) { System.out.print((char)char); } in.close(); } catch (IOException e) { e.printStackTrace(); } } }
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.