ฉันมักจะหลีกเลี่ยงให้ชั้นเรียนรู้วิธีทำให้เป็นอันดับของตัวเองด้วยเหตุผลสองประการ ก่อนอื่นถ้าคุณต้องการ (เป็น) ต่อเนื่องกันเป็นรูปแบบ / จากรูปแบบที่แตกต่างกันตอนนี้คุณต้องสร้างมลพิษให้กับตัวแบบด้วยตรรกะพิเศษนั้น หากโมเดลนั้นเข้าถึงได้จากอินเทอร์เฟซคุณจะต้องเสียสัญญา
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
}
แต่ถ้าคุณต้องการทำให้เป็นอนุกรมจาก / PNG และ GIF ตอนนี้ชั้นจะกลายเป็น
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
public void toPNG(String filePath) { ... }
public Image fromPNG(String filePath) { ... }
public void toGIF(String filePath) { ... }
public Image fromGIF(String filePath) { ... }
}
แต่โดยทั่วไปแล้วฉันต้องการใช้รูปแบบที่คล้ายกับสิ่งต่อไปนี้:
public interface ImageSerializer
{
void serialize(Image src, Stream outputStream);
Image deserialize(Stream inputStream);
}
public class JPGImageSerializer : ImageSerializer
{
public void serialize(Image src, Stream outputStream) { ... }
public Image deserialize(Stream inputStream) { ... }
}
public class PNGImageSerializer : ImageSerializer
{
public void serialize(Image src, Stream outputStream) { ... }
public Image deserialize(Stream inputStream) { ... }
}
public class GIFImageSerializer : ImageSerializer
{
public void serialize(Image src, Stream outputStream) { ... }
public Image deserialize(Stream inputStream) { ... }
}
ตอนนี้ ณ จุดนี้หนึ่งใน caveats ที่มีการออกแบบนี้คือ serializers จำเป็นต้องรู้identity
ของวัตถุที่เป็นอนุกรม บางคนบอกว่านี่คือการออกแบบที่ไม่ดีเนื่องจากการนำไปใช้นอกรั่วของคลาส ความเสี่ยง / ผลตอบแทนของสิ่งนี้ขึ้นอยู่กับคุณ แต่คุณสามารถปรับแต่งชั้นเรียนเล็กน้อยเพื่อทำสิ่งที่ต้องการ
public class Image
{
public void serializeTo(ImageSerializer serializer, Stream outputStream)
{
serializer.serialize(this.pixelData, outputStream);
}
public void deserializeFrom(ImageSerializer serializer, Stream inputStream)
{
this.pixelData = serializer.deserialize(inputStream);
}
}
นี่เป็นตัวอย่างทั่วไปมากขึ้นเนื่องจากภาพมักจะมีข้อมูลเมตาที่สอดคล้องกับมัน สิ่งต่าง ๆ เช่นระดับการบีบอัด colorspace ฯลฯ ซึ่งอาจทำให้กระบวนการมีความซับซ้อน