"สวัสดี Amigo วันนี้ Ellie บอกคุณเกี่ยวกับรูปแบบอะแดปเตอร์"

คลาสส่วนใหญ่ที่เกี่ยวข้องกับสตรีม I/O ถูกนำไปใช้เป็นอะแด็ปเตอร์ พวกเขาอาจแปลงอินเทอร์เฟซที่เทียบเท่ากันหรือเชื่อมต่อเข้าด้วยกัน โดยเริ่มจากแบบเรียบง่ายไปจนถึงแบบซับซ้อน

" InputStreamReaderและBufferedReaderเป็นอแดปเตอร์ด้วยหรือไม่ อย่างน้อยที่สุด พวกมันมีความคล้ายคลึงกับอแดปเตอร์ในลักษณะการใช้งาน: หลังจากสร้างออบเจกต์แล้ว อ็อบเจกต์จะถูกส่งผ่านไปยังคอนสตรัคเตอร์ของคลาสอื่น"

"ใช่InputStreamReaderแปลง อินเทอร์เฟซ InputStreamเป็น อินเทอร์ เฟซReader BufferedReaderไม่ใช่อแด็ปเตอร์ในรูปแบบที่บริสุทธิ์ที่สุด เนื่องจากผู้สร้าง Java ตัดสินใจที่จะไม่ให้วิธีการของตนใช้อินเทอร์เฟซแยกต่างหาก แต่มันเป็นจิตวิญญาณแบบเครือญาติ"

แทนที่จะเขียนคลาสที่แตกต่างกันเป็นล้านๆ คลาส ผู้สร้าง Java เขียนอะแดปเตอร์สองโหลและอนุญาตให้เชื่อมต่อระหว่างกันตามที่โปรแกรมเมอร์อาจต้องการ

วิธีนี้สะดวกมาก โปรแกรมเมอร์สามารถเขียนคลาสและ/หรืออแดปเตอร์ของเธอ ให้มันใช้งานอินเทอร์เฟซมาตรฐาน และรวมไว้ในห่วงโซ่ของอ็อบเจกต์อแดปเตอร์ที่เธอกำลังสร้าง

"นั่นคือวิธีการทำงานทั้งหมด แทนที่จะเป็นคลาสที่ซับซ้อนขนาดใหญ่ เราสร้างห่วงโซ่ของออบเจกต์และอแดปเตอร์ธรรมดา จากนั้นคุณก็สร้างมันขึ้นมาและรวมเข้าด้วยกันตามลำดับที่ถูกต้อง!"

"และคุณใช้สิ่งที่ขาดหายไป"

“ครับ ผมเข้าใจแล้ว”

"แต่ที่จริงฉันอยากจะบอกคุณเกี่ยวกับReaderและWriterในวันนี้ คลาสนามธรรมสองคลาสนี้คล้ายกันมากกับคลาส InputStream และ OutputStream แต่คลาสทั้งสองนี้แตกต่างจากคลาสเหล่านั้นตรงที่ทำงานกับอักขระ พวกเขาอ่านและเขียนอักขระ พวกเขาคือ สะดวกมากเมื่อทำงานกับข้อมูลที่เป็นข้อความ ลองมาดูวิธีการที่พวกเขามี:"

วิธีการอ่าน วิธีการทำอะไร
int read(char[] cbuf);
"วิธีนี้จะอ่านอักขระหลายตัวลงในบัฟเฟอร์ ทันที ( char array ) จนกว่าบัฟเฟอร์จะเต็มหรือจนกว่าซอร์สจะไม่มีอักขระให้อ่านอีก"
เมธอดส่งคืนจำนวนอักขระที่อ่านจริง (ซึ่งอาจน้อยกว่าความยาวของอาร์เรย์)
int read();
"เมธอดนี้อ่านอักขระหนึ่งตัวและส่งกลับ ผลลัพธ์จะถูกขยายเป็น int สำหรับการค้นหา หากไม่มีอักขระที่ใช้ได้ เมธอดจะส่งคืน -1"
boolean ready();
วิธีนี้จะคืนค่าจริงหากมีอักขระที่ยังไม่ได้อ่านสำหรับวิธีการอ่าน
void close();
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว
จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ
ณ จุดนี้ คุณจะไม่สามารถอ่านข้อมูลใด ๆ จากสตรีมได้อีก

"กลายเป็นว่า เมธอด read(char [] cbuf) ของ Reader ช่วยให้เราอ่านบล็อกอักขระทั้งหมด แทนที่จะอ่านทีละอักขระ ดังนั้นจึงรวดเร็วและสะดวกยิ่งขึ้น"

"แน่นอน ทีนี้มาดูกันว่า Writer มีวิธีใดบ้าง:"

วิธี วิธีการทำอะไร
void write(int c);
วิธีนี้เขียนหนึ่งอักขระ ประเภท int ถูกทำให้แคบลงเป็นอักขระ ส่วนพิเศษจะถูกละทิ้งไป
void write(char[] cbuff);
วิธีนี้เขียนอาร์เรย์ของอักขระ
void write(String s);
วิธีนี้เขียนสตริง มันถูกแปลงเป็นอาร์เรย์ของอักขระแล้วเรียกเมธอดที่สอง
void flush();
หากสตรีมกำลังจัดเก็บข้อมูลใดๆ ที่ยังไม่ได้เขียนไว้ภายใน วิธีการนี้จะบังคับให้เขียน
void close();
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว
จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ คุณไม่สามารถเขียนข้อมูลไปยังสตรีมได้อีกต่อไป และการล้างข้อมูลจะถูกเรียกโดยอัตโนมัติ

สิ่งสำคัญคือต้องเข้าใจว่าReaderและWriterเป็นคลาสนามธรรม พวกเขาไม่ได้ทำอะไรเลยและแทบไม่มีรหัสเลย วิธีการทั้งหมดจะต้องนำไปใช้ในคลาสที่สืบทอดมา งานของพวกเขาคือสร้างมาตรฐานว่าชั้นเรียนมีปฏิสัมพันธ์กันอย่างไร นักพัฒนาไม่จำเป็นต้องคิดค้นมาตรฐานของตนเองเพื่อโต้ตอบซึ่งกันและกัน สะดวกกว่ามากสำหรับทุกคนในการรักษามาตรฐานพื้นฐานบางประการ สิ่งนี้ทำให้คลาสที่เขียนโดยโปรแกรมเมอร์ที่แตกต่างกันสามารถโต้ตอบได้อย่างง่ายดาย ไม่เพียงแต่กับคลาสที่เขียนโดยผู้สร้าง Java เท่านั้น แต่ยังรวมถึงคลาสที่เขียนโดยโปรแกรมเมอร์คนอื่นด้วย

มาตรฐานนั้นทรงพลัง

"ฉันเห็นด้วย การสนับสนุนมาตรฐานทั่วไปเป็นประโยชน์ต่อทุกคน"