วันอาทิตย์ที่ 26 กรกฎาคม พ.ศ. 2558

ชวนคุยจาวา part 14-2 : มาสร้าง DocumentLocker กันเถอะ

Java OOP Example
: DocumentLocker part 2/2

>> ต่อจาก part แรกที่ว่า หากจะให้เอกสารของเราสามารถใส่รหัสป้องกันเข้าไปด้วย ด้วยจาวาคลาสเท่าที่มีจะทำได้อย่างไร หนึ่งในหลายวิธีการที่ทำให้บรรลุเป้าหมายและเป็นที่ยอมรับ นั่นก็คือการใช้ decorator pattern ครับ

>> decorator pattern ว่าด้วยการเพิ่มสิ่งใหม่ลงไปยังสิ่งเดิมที่มีอยู่ โดยไม่กระทบโครงสร้างเดิมของสิ่งเดิมนั้น ในที่นี้คือ ผมมีเอกสาร (document) และผมจะกำหนดรหัส (password) ให้กับมันสำหรับใครก็ตามที่ต้องการอ่านหรือเขียนเอกสารเจ้ากรรม นั่นแสดงว่าผมต้องการ input สองอย่าง
1) document object
2) password string
ดังนี้ครับ

public AbstractSecurityDocument(Document document, String password)

ข้างต้นนี้คือ constructor ของคลาส AbstractSecurityDocument ซึ่งเป็น abstract จัดเตรียมไว้ให้สืบทอด และมันยังคงต้อง read และ write ได้อย่างเดิม จึง implement เจ้า interface ที่ชื่อ Document ให้เป็นกติกาบังคับ สุดท้ายก็เพิ่มบริการสำหรับตรวจสอบรหัสว่าถูกต้องหรือไม่ (check password) ดังนี้ครับ

public abstract class AbstractSecurityDocument implements Document {
private final Document document;
private final String password;
protected final Messager messager;

public AbstractSecurityDocument(Document document, String password) {
this.document = document;
this.password = password;
messager = new Messager();
}

@Override
public String read() {
return document.read();
}

@Override
public void write(String content) {
document.write(content);
}

public boolean checkPassword(String yourPassword) {
return password.equals(yourPassword);
}
}

>> ไม่รอช้า สร้างอีกคลาสชื่อ SecurityDocument มาขยาย (สืบทอด) มันซะเลย โดยใช้บริหารตรวจสอบรหัสผ่านที่ได้เอ่ยไป เป็นเครื่องมือตรวจสอบว่า ผู้ที่ต้องกรอ่านหรือเขียนเอกสารเจ้ากรรมได้ใส่รหัสเข้ามาถูกต้องหรือไม่ ผ่านบริการที่ชื่อ enterPassword ครับ

public class SecurityDocument extends AbstractSecurityDocument {
private String yourPassword;

public SecurityDocument(Document document, String password) {
super(document, password);
}

@Override
public String read() {
if(checkPassword(yourPassword)) {
return super.read();
} else {
messager.showException("You don't have permission to read this document");
return "";
}
}

@Override
public void write(String content) {
if(checkPassword(yourPassword)) {
super.write(content);
} else {
messager.showException("You don't have permission to write this document");
}
}

public void enterPassword(String yourPassword) {
this.yourPassword = yourPassword;
}
}

>> และแล้วก็ทดสอบ โดยขอเอกสารมาจากโรงงาน จากนั้นใส่รหัสล็อคไว้ก่อนด้วย SecurityDocument ตามนี้

public class Program {
public static void main(String[] args) {
DocumentFactory factory = new DocumentFactory();

Document readOnlyDocument = factory.get(DocumentSpec.READ_ONLY, "AAA");
Document readWriteDocument = factory.get(DocumentSpec.READ_WRITE, "BBB");

SecurityDocument securityReadOnlyDocument = new SecurityDocument(readOnlyDocument, "1234");
SecurityDocument securityReadWriteDocument = new SecurityDocument(readWriteDocument, "1234");

securityReadOnlyDocument.enterPassword("4321");
securityReadOnlyDocument.write("XXX");
System.out.println(securityReadOnlyDocument.read());
System.out.println("--------------------");

securityReadWriteDocument.enterPassword("1234");
securityReadWriteDocument.write("YYY");
System.out.println(securityReadWriteDocument.read());
}
}

เอกสาร AAA ที่อ่านได้อย่างเดียวใส่รหัสไว้เช่นเดียวกับเอกสาร BBB ที่ทั้งอ่านและเขียนได้ แต่เอกสาร AAA เมื่อพยายามจะอ่านและเขียน XXX ลงไปโดยทดสอบใส่รหัสผิดปรากฏว่าไม่สามารถอ่านหรือเขียนได้เลย (ปกติมันก็เขียนไม่ได้อยู่แล้ว ตอนนี้อ่านไม่ได้ด้วยเพราะรหัสไม่ถูก) ต่างจากเอกสาร BBB เมื่อพยายามจะอ่านและเขียน YYY ลงไปโดยได้ใส่หรัสถูกต้อง ปรากฏว่าสามารถเขียนและอ่านออกมาได้ครับผม เชิญชมผลลัพธ์

Exception: You don't have permission to write this document
Exception: You don't have permission to read this document

--------------------
YYY

>> นี่แหละจึงเรียกว่าเรื่องนี้ว่า DocumentLocker สำหรับคืนนี้ฝันดีครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น