"สวัสดี Amigo วันนี้ Ellie บอกคุณเกี่ยวกับรูปแบบอะแดปเตอร์"
คลาสส่วนใหญ่ที่เกี่ยวข้องกับสตรีม I/O ถูกนำไปใช้เป็นอะแด็ปเตอร์ พวกเขาอาจแปลงอินเทอร์เฟซที่เทียบเท่ากันหรือเชื่อมต่อเข้าด้วยกัน โดยเริ่มจากแบบเรียบง่ายไปจนถึงแบบซับซ้อน
" InputStreamReaderและBufferedReaderเป็นอแดปเตอร์ด้วยหรือไม่ อย่างน้อยที่สุด พวกมันมีความคล้ายคลึงกับอแดปเตอร์ในลักษณะการใช้งาน: หลังจากสร้างออบเจกต์แล้ว อ็อบเจกต์จะถูกส่งผ่านไปยังคอนสตรัคเตอร์ของคลาสอื่น"
"ใช่InputStreamReaderแปลง อินเทอร์เฟซ InputStreamเป็น อินเทอร์ เฟซReader BufferedReaderไม่ใช่อแด็ปเตอร์ในรูปแบบที่บริสุทธิ์ที่สุด เนื่องจากผู้สร้าง Java ตัดสินใจที่จะไม่ให้วิธีการของตนใช้อินเทอร์เฟซแยกต่างหาก แต่มันเป็นจิตวิญญาณแบบเครือญาติ"
แทนที่จะเขียนคลาสที่แตกต่างกันเป็นล้านๆ คลาส ผู้สร้าง Java เขียนอะแดปเตอร์สองโหลและอนุญาตให้เชื่อมต่อระหว่างกันตามที่โปรแกรมเมอร์อาจต้องการ
วิธีนี้สะดวกมาก โปรแกรมเมอร์สามารถเขียนคลาสและ/หรืออแดปเตอร์ของเธอ ให้มันใช้งานอินเทอร์เฟซมาตรฐาน และรวมไว้ในห่วงโซ่ของอ็อบเจกต์อแดปเตอร์ที่เธอกำลังสร้าง
"นั่นคือวิธีการทำงานทั้งหมด แทนที่จะเป็นคลาสที่ซับซ้อนขนาดใหญ่ เราสร้างห่วงโซ่ของออบเจกต์และอแดปเตอร์ธรรมดา จากนั้นคุณก็สร้างมันขึ้นมาและรวมเข้าด้วยกันตามลำดับที่ถูกต้อง!"
"และคุณใช้สิ่งที่ขาดหายไป"
“ครับ ผมเข้าใจแล้ว”
"แต่ที่จริงฉันอยากจะบอกคุณเกี่ยวกับReaderและWriterในวันนี้ คลาสนามธรรมสองคลาสนี้คล้ายกันมากกับคลาส InputStream และ OutputStream แต่คลาสทั้งสองนี้แตกต่างจากคลาสเหล่านั้นตรงที่ทำงานกับอักขระ พวกเขาอ่านและเขียนอักขระ พวกเขาคือ สะดวกมากเมื่อทำงานกับข้อมูลที่เป็นข้อความ ลองมาดูวิธีการที่พวกเขามี:"
วิธีการอ่าน | วิธีการทำอะไร |
---|---|
|
"วิธีนี้จะอ่านอักขระหลายตัวลงในบัฟเฟอร์ ทันที ( char array ) จนกว่าบัฟเฟอร์จะเต็มหรือจนกว่าซอร์สจะไม่มีอักขระให้อ่านอีก" เมธอดส่งคืนจำนวนอักขระที่อ่านจริง (ซึ่งอาจน้อยกว่าความยาวของอาร์เรย์) |
|
"เมธอดนี้อ่านอักขระหนึ่งตัวและส่งกลับ ผลลัพธ์จะถูกขยายเป็น int สำหรับการค้นหา หากไม่มีอักขระที่ใช้ได้ เมธอดจะส่งคืน -1" |
|
วิธีนี้จะคืนค่าจริงหากมีอักขระที่ยังไม่ได้อ่านสำหรับวิธีการอ่าน |
|
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ ณ จุดนี้ คุณจะไม่สามารถอ่านข้อมูลใด ๆ จากสตรีมได้อีก |
"กลายเป็นว่า เมธอด read(char [] cbuf) ของ Reader ช่วยให้เราอ่านบล็อกอักขระทั้งหมด แทนที่จะอ่านทีละอักขระ ดังนั้นจึงรวดเร็วและสะดวกยิ่งขึ้น"
"แน่นอน ทีนี้มาดูกันว่า Writer มีวิธีใดบ้าง:"
วิธี | วิธีการทำอะไร |
---|---|
|
วิธีนี้เขียนหนึ่งอักขระ ประเภท int ถูกทำให้แคบลงเป็นอักขระ ส่วนพิเศษจะถูกละทิ้งไป |
|
วิธีนี้เขียนอาร์เรย์ของอักขระ |
|
วิธีนี้เขียนสตริง มันถูกแปลงเป็นอาร์เรย์ของอักขระแล้วเรียกเมธอดที่สอง |
|
หากสตรีมกำลังจัดเก็บข้อมูลใดๆ ที่ยังไม่ได้เขียนไว้ภายใน วิธีการนี้จะบังคับให้เขียน |
|
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ คุณไม่สามารถเขียนข้อมูลไปยังสตรีมได้อีกต่อไป และการล้างข้อมูลจะถูกเรียกโดยอัตโนมัติ |
สิ่งสำคัญคือต้องเข้าใจว่าReaderและWriterเป็นคลาสนามธรรม พวกเขาไม่ได้ทำอะไรเลยและแทบไม่มีรหัสเลย วิธีการทั้งหมดจะต้องนำไปใช้ในคลาสที่สืบทอดมา งานของพวกเขาคือสร้างมาตรฐานว่าชั้นเรียนมีปฏิสัมพันธ์กันอย่างไร นักพัฒนาไม่จำเป็นต้องคิดค้นมาตรฐานของตนเองเพื่อโต้ตอบซึ่งกันและกัน สะดวกกว่ามากสำหรับทุกคนในการรักษามาตรฐานพื้นฐานบางประการ สิ่งนี้ทำให้คลาสที่เขียนโดยโปรแกรมเมอร์ที่แตกต่างกันสามารถโต้ตอบได้อย่างง่ายดาย ไม่เพียงแต่กับคลาสที่เขียนโดยผู้สร้าง Java เท่านั้น แต่ยังรวมถึงคลาสที่เขียนโดยโปรแกรมเมอร์คนอื่นด้วย
มาตรฐานนั้นทรงพลัง
"ฉันเห็นด้วย การสนับสนุนมาตรฐานทั่วไปเป็นประโยชน์ต่อทุกคน"