บทความนี้อธิบายถึงหลักการและการใช้โหมดการตกแต่งของรูปแบบการออกแบบ Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
โหมดการตกแต่งสามารถขยายฟังก์ชันการทำงานของวัตถุแบบไดนามิกโดยไม่ต้องเปลี่ยนไฟล์ต้นฉบับและใช้การสืบทอด มันห่อวัตถุจริงโดยการสร้างวัตถุห่อหุ้มนั่นคือการตกแต่ง การออกแบบของ IO ใน JDK ใช้โหมดการตกแต่งซึ่งสามารถขยายฟังก์ชั่นได้โดยการห่อโฟลว์ของโหนดผ่านการไหลของการกรอง
องค์ประกอบของตัวละครในโหมดตกแต่ง:
①บทบาทส่วนประกอบนามธรรม: ให้อินเทอร์เฟซนามธรรมเพื่อสร้างมาตรฐานวัตถุที่พร้อมที่จะรับฟังก์ชั่นการประมวลผล (InputStream, OutputStream)
②บทบาทองค์ประกอบคอนกรีต: กำหนดคลาสที่จะได้รับฟังก์ชั่นเพิ่มเติม (การไหลของโหนด)
③บทบาทมัณฑนากร: ถืออินสแตนซ์ของวัตถุส่วนประกอบและดำเนินการอินเทอร์เฟซที่สอดคล้องกับส่วนต่อประสานส่วนประกอบนามธรรม (FilterInputStream, FilterOutputStream)
④บทบาทมัณฑนากรคอนกรีต: รับผิดชอบในการเพิ่มฟังก์ชั่นเพิ่มเติมให้กับวัตถุส่วนประกอบ (การไหลของตัวกรองที่มีฟังก์ชั่นเพิ่มเติมเฉพาะ, bufferedInputStream, datainputStream ฯลฯ )
นี่คือตัวอย่างง่ายๆของรูปแบบการตกแต่ง:
1. บทคัดย่อบทบาทบทบาท : กำหนดส่วนประกอบอินเตอร์เฟส
แพ็คเกจ com.tydic.decorator; // บทคัดย่อบทบาทส่วนประกอบส่วนประกอบสาธารณะส่วนประกอบ {โมฆะสาธารณะ dosomething ();};2. บทบาทการก่อสร้างที่เฉพาะเจาะจง : คุณต้องใช้บทบาทส่วนประกอบนามธรรมและคุณสามารถเพิ่มความรับผิดชอบบางอย่างให้กับวัตถุนี้
แพ็คเกจ com.tydic.decorator;/** * การสร้างบทบาทคอนกรีตใช้งานบทคัดย่อบทบาทการก่อสร้าง * @author ผู้ดูแลระบบ * */concretecomponent คลาสสาธารณะใช้ส่วนประกอบ {@Override โมฆะสาธารณะ dosomething () {system.out.println ("ฟังก์ชัน A"); - 3. การตกแต่งบทบาท : ถือวัตถุเพื่อสร้างการอ้างอิงถึงบทบาทและใช้บทบาทองค์ประกอบนามธรรม บทบาทส่วนประกอบนามธรรมถูกนำมาใช้เนื่องจากประเภทไม่สามารถเปลี่ยนแปลงได้หลังจากเพิ่มฟังก์ชั่นเช่นเดียวกับ FilterInputStream ยังคงเป็นสตรีมอินพุตซึ่งยังคงมีคุณสมบัติของสตรีมอินพุต การอ้างอิงถึงบทบาทการสร้างวัตถุเป็นเพราะเพื่อเพิ่มฟังก์ชั่นคุณต้องมีการอ้างอิงถึงบทบาทส่วนประกอบที่จะต้องแนบฟังก์ชั่น
แพ็คเกจ com.tydic.decorator;/*** ตกแต่งบทบาทถือการอ้างอิงถึงบทบาทส่วนประกอบและใช้บทบาทส่วนประกอบ* หากคุณต้องการเพิ่มฟังก์ชั่นคุณต้องใช้บทบาทส่วนประกอบ ในการเพิ่มฟังก์ชั่นคุณจะต้องอ้างอิงถึงบทบาทส่วนประกอบที่จะแนบ นี่คือเหตุผลที่คุณต้องมีการอ้างอิงถึงบทบาทส่วนประกอบ * @author Administrator * */Decorator ชั้นเรียนสาธารณะใช้ส่วนประกอบ {ส่วนประกอบส่วนตัว; // นี่คือบทบาทส่วนประกอบที่จะแนบซึ่งสามารถอัปโหลดได้เมื่อมัสเทคเตอร์สาธารณะ } @Override โมฆะสาธารณะ dosomething () {component.dosomething (); -4. บทบาทการตกแต่งเฉพาะ : บทบาทการตกแต่งจำเป็นต้องได้รับการสืบทอดและฟังก์ชั่นที่จะแนบมา
แพ็คเกจ com.tydic.decorator;/** * สำหรับบทบาทการตกแต่งที่เฉพาะเจาะจง 1 บทบาทการตกแต่งจะต้องได้รับการสืบทอดและฟังก์ชั่นที่จะแนบจะได้รับ * @author administrator * */concretedecorator1 ระดับสาธารณะ } @Override โมฆะสาธารณะ dosomething () {super.dosomething (); this.doanothing (); // เพิ่มฟังก์ชั่นบนพื้นฐานของฟังก์ชั่นดั้งเดิมของบทบาทองค์ประกอบเฉพาะที่ผ่าน} // ฟังก์ชั่นเพิ่มเติมโมฆะสาธารณะ doanothing () {system.out.println ("ฟังก์ชัน B"); - แพ็คเกจ com.tydic.decorator;/** * สำหรับบทบาทการตกแต่งที่เฉพาะเจาะจง 2 บทบาทการตกแต่งจะต้องได้รับการสืบทอดและฟังก์ชั่นที่จะแนบจะได้รับ * @author ผู้ดูแลระบบ * */คลาสสาธารณะ concretedecorator2 ขยาย Dorunator } @Override โมฆะสาธารณะ dosomething () {super.dosomething (); this.doanothing (); // ฟังก์ชั่นเพิ่มเติมโมฆะสาธารณะ doanothing () {system.out.println ("ฟังก์ชั่น c"); -5. เขียนรหัสลูกค้า
แพ็คเกจ com.tydic.decorator; ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {องค์ประกอบส่วนประกอบ = คอนกรีตคอนคอมพ์ออนใหม่ (); // สร้างองค์ประกอบส่วนประกอบบทบาท 2 = concretedecorator1 (ส่วนประกอบ); ส่วนประกอบ 3.Dosomething (); -สรุป:
โหมดการตกแต่งสามารถใช้วิธีการรวมกันและขยายวัตถุแบบไดนามิกที่รันไทม์โดยไม่ต้องสืบทอด นี่คือสิ่งที่มรดกไม่สามารถทำได้ มรดกเป็นแบบคงที่ส่วนขยายไปยังชั้นเรียน
ข้อดีและข้อเสียของโหมดตกแต่ง:
ข้อดี: 1. ขยายฟังก์ชั่นของวัตถุซึ่งมีความยืดหยุ่นมากกว่าการสืบทอด 2. ด้วยการใช้หมวดหมู่การตกแต่งที่แตกต่างกันและการจัดเรียงและการรวมกันของหมวดหมู่การตกแต่งเหล่านี้นักออกแบบสามารถสร้างพฤติกรรมที่แตกต่างกันมากมาย
ข้อเสีย: มันจะทำให้โปรแกรมมีความซับซ้อนมากขึ้น
สำหรับเนื้อหาที่เกี่ยวข้องกับ Java ผู้อ่านที่สนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "บทนำและการสอนขั้นสูงเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ Java", "การสอนเกี่ยวกับโครงสร้างข้อมูล Java และอัลกอริทึม" สรุปการดำเนินงานของ Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน