การทำความเข้าใจและการใช้รูปแบบการออกแบบสามารถปลูกฝังพฤติกรรมการเขียนโปรแกรมเชิงวัตถุที่ดีของเราและในการใช้งานจริงเราสามารถสนุกกับความสนุกสนาน
Proxy เป็นแบบจำลองที่ค่อนข้างมีประโยชน์และมีหลายรุ่น อธิบายว่า: จากจุดเริ่มต้นถึงมีเลเยอร์กลางระหว่างจุดหมายปลายทางความหมายของตัวแทน
กำหนดไว้ในรูปแบบการออกแบบ: ให้พร็อกซีสำหรับวัตถุอื่น ๆ เพื่อควบคุมการเข้าถึงวัตถุนี้
ทำไมต้องใช้โหมดพร็อกซี
1. กลไกการอนุญาตผู้ใช้ในระดับที่แตกต่างกันมีสิทธิ์การเข้าถึงที่แตกต่างกันไปในวัตถุเดียวกัน (ผู้ใช้ที่ไม่ได้ลงทะเบียน) และใน Jive สิ่งนี้จะช่วยให้คุณสามารถควบคุมสิทธิ์การเข้าถึงของผู้ใช้สองคนนี้ไปยังฟอรัมผ่านพร็อกซีเช่นฟอรัมพร็อกซี
2. ไคลเอนต์ไม่สามารถทำงานโดยตรงกับวัตถุ แต่ต้องโต้ตอบกับวัตถุนั้น
ให้สองตัวอย่างเฉพาะ:
1. หากวัตถุเป็นภาพขนาดใหญ่และใช้เวลานานในการแสดงมันจากนั้นเมื่อภาพรวมอยู่ในเอกสารให้ใช้ตัวแก้ไขหรือเบราว์เซอร์เพื่อเปิดเอกสารและเอกสารจะต้องเปิดอย่างรวดเร็วและไม่สามารถรอได้ . การประมวลผลภาพขนาดใหญ่เสร็จสมบูรณ์และในเวลานี้พร็อกซีของภาพจะต้องใช้เพื่อแทนที่ภาพจริง
2. หากวัตถุนั้นอยู่บนเซิร์ฟเวอร์ระยะไกลบนอินเทอร์เน็ตและทำงานโดยตรงวัตถุนี้อาจช้าเนื่องจากความเร็วเครือข่ายเราสามารถใช้พร็อกซีเพื่อแทนที่วัตถุนั้นก่อน
ในระยะสั้นหลักการคือสำหรับวัตถุที่มีค่าใช้จ่ายสูงพวกเขาจะถูกสร้างขึ้นเมื่อใช้มันเท่านั้น ดังนั้นบางคนคิดว่า Java ใช้หน่วยความจำทรัพยากรและฉันคิดว่าสิ่งนี้มีส่วนเกี่ยวข้องกับแนวคิดการเขียนโปรแกรม
วิธีใช้โหมดพร็อกซี
การใช้ระบบ Jive Forum เป็นตัวอย่างมีผู้ใช้หลายประเภทที่เข้าเยี่ยมชมระบบฟอรัม: ผู้ใช้ทั่วไปที่ลงทะเบียนผู้จัดการฟอรัมผู้จัดการระบบและนักท่องเที่ยว โดยการลงทะเบียนผู้ใช้ทั่วไปเท่านั้นที่สามารถพูดได้
ฟอรัมเป็นอินเทอร์เฟซหลักของ Jive
ผู้ใช้ที่มีการอนุญาตในระดับต่าง ๆ ถูกกำหนดใน Forumpermissions:
การคัดลอกรหัสมีดังนี้:
ForumperMissions ระดับสาธารณะใช้งาน cacheable {
-
* อนุญาตให้อ่านวัตถุ
-
public Static Final Int อ่าน = 0;
-
* อนุญาตให้ผู้ดูแลระบบทั้งระบบ
-
public Static Final Int System_admin = 1;
-
* อนุญาตให้ผู้ดูแลระบบฟอรัมเฉพาะ
-
สาธารณะคงที่สุดท้าย int forum_admin = 2;
-
* อนุญาตให้ผู้ดูแลระบบผู้ใช้เฉพาะ
-
public Static Final Int User_admin = 3;
-
* อนุญาตให้ผู้ดูแลระบบกลุ่มใดกลุ่มหนึ่ง
-
public Static Final Int Group_admin = 4;
-
* อนุญาตให้ใช้เธรดที่ทันสมัย
-
สาธารณะคงที่สุดท้าย int moderate_threads = 5;
-
* อนุญาตให้สร้างเธรดใหม่
-
public Static Final int create_thread = 6;
-
* อนุญาตให้สร้างข้อความใหม่
-
public Static Final int create_message = 7;
-
* อนุญาตให้ใช้ข้อความที่ทันสมัย
-
สาธารณะคงที่สุดท้าย int moderate_messages = 8;
-
บูลีนสาธารณะ issystemorumadmin () {
return (ค่า [forum_admin] || ค่า [system_admin]);
-
-
-
ดังนั้นสิทธิ์ในการดำเนินการต่าง ๆ ในฟอรัมจึงเกี่ยวข้องกับระดับผู้ใช้ที่กำหนดโดยฟอรัมเพอร์มิสเซียส ตัวอย่างเช่นเมื่อแก้ไขชื่อของฟอรัมเฉพาะ Forum Manager หรือ System Manager เท่านั้นที่สามารถแก้ไขได้รหัสจะมีดังนี้:
การคัดลอกรหัสมีดังนี้:
ชั้นเรียนสาธารณะ ForumProxy ใช้ฟอรัม {
การอนุญาตให้ใช้ฟอรัมเพอร์มิชชันส่วนตัว
ฟอรัมส่วนตัวฟอรัม;
this.Authorization = การอนุญาต;
Forumproxy สาธารณะ (ฟอรัมฟอรัมการอนุญาตการอนุญาต
การอนุญาต ForumperMissions) {
this.forum = ฟอรัม;
this.Authorization = การอนุญาต;
this.permissions = การอนุญาต;
-
-
โมฆะสาธารณะ setName (ชื่อสตริง) พ่นไม่ได้รับอนุญาต Exception
ForumalreadyExistsexception {
// เฉพาะระบบหรือผู้ดูแลระบบฟอรัมเท่านั้นที่สามารถแก้ไขชื่อได้หาก (Permissions.IssystemOrumAdmin ()) {
Forum.setName (ชื่อ);
-
อื่น {
โยนใหม่ที่ไม่ได้รับอนุญาต ();
-
-
-
-
DBFORUM คือการใช้งานฟอรัมอินเตอร์เฟสที่แท้จริง
การคัดลอกรหัสมีดังนี้:
ระดับสาธารณะ DBFORUM ใช้ฟอรัม, cacheable {
-
โมฆะสาธารณะ setName (ชื่อสตริง) โยน forumalreadyExistSexception {
-
this.name = ชื่อ;
// ที่นี่คุณบันทึกชื่อใหม่ลงในฐานข้อมูลเป็น Savetodb ();
-
-
-
-
เมื่อใดก็ตามที่มีการแก้ไขชื่อฟอรัมโปรแกรมอื่น ๆ จะต้องจัดการกับ ForumProxy ก่อน
ในแอปพลิเคชันรายวันเป็นสิ่งที่หลีกเลี่ยงไม่ได้ที่การอนุญาตระบบหรือระบบความปลอดภัยจะมีส่วนร่วมเสมอ
มาพูดคุยกันอย่างลึกซึ้งยิ่งขึ้นเมื่อรวมกับ Jive และรูปแบบโรงงานจะมีส่วนร่วมด้านล่าง
เรารู้อยู่แล้วว่าการใช้ฟอรัมต้องใช้ ForumProxy Singleton ใช้ที่นี่ (เช่นหนึ่งในรูปแบบการออกแบบ), GetInstance () ส่งคืน ForumFactoryProxy
ทำไมไม่ส่งคืน ForumFactory แต่กลับมาใช้งาน ForumFactory ForumFactoryProxy เหตุผลนั้นชัดเจนและจำเป็นต้องพิจารณาว่าฟอรัมมีสิทธิ์สร้างมันผ่านพร็อกซีหรือไม่
ใน ForumFactoryProxy เราเห็นรหัสดังนี้:
การคัดลอกรหัสมีดังนี้:
ชั้นเรียนสาธารณะ ForumFactoryProxy ขยาย ForumFactory {
ได้รับการคุ้มครองโรงงานฟอรัมแฟคเตอร์;
การอนุญาตการอนุญาตที่ได้รับการคุ้มครอง;
ได้รับการปกป้องจากการอนุญาตของฟอรัมเพอร์มิสเซียส
Public ForumFactoryProxy (การอนุญาตการอนุญาต, โรงงานฟอรัมแฟคตอรี่, สิทธิ์ของฟอรัมเพอร์มิสเซียส) {
this.factory = โรงงาน;
this.Authorization = การอนุญาต;
this.permissions = การอนุญาต;
-
ฟอรัมสาธารณะ CreateForum (ชื่อสตริง, คำอธิบายสตริง)
โยน unauidizedexception, forumalreadyExistsexception {
// เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถสร้างฟอรัม
if (permissions.get (forumpermissions.system_admin)) {
ฟอรั่ม newforum = factory.createforum (ชื่อ, คำอธิบาย);
ส่งคืน ForumProxy ใหม่ (Newforum, การอนุญาต, สิทธิ์);
-
อื่น {
โยนใหม่โดยไม่ได้รับอนุญาต ();
-
-
-
วิธีการสร้างฟอรัมส่งผลให้ ForumProxy
ขอให้สังเกตว่ามีพร็อกซีสองตัวที่นี่: Forumproxy และ ForumfactoryProxy แสดงถึงความรับผิดชอบที่แตกต่างกันสองประการ: การใช้ฟอรัมและการสร้างฟอรัม สำหรับสาเหตุที่การใช้วัตถุถูกแยกออกจากการสร้างวัตถุนี่คือเหตุผลที่ใช้รูปแบบของโรงงาน: มันมีไว้สำหรับ "การห่อหุ้ม" และ "ส่ง" กล่าวอีกนัยหนึ่งฟังก์ชั่นนั้นเป็นไปได้มากที่สุดเท่าที่จะทำได้เพื่ออำนวยความสะดวกในการบำรุงรักษาและการปรับเปลี่ยน
การสร้างโพสต์อื่น ๆ และการใช้งานในระบบ Jive Forum ขึ้นอยู่กับแนวคิดของฟอรัม
ข้างต้นเราพูดถึงวิธีการใช้พร็อกซีสำหรับการเข้าถึงกลไกการอนุญาต การคัดลอกวัตถุขนาดใหญ่และซับซ้อนเป็นการดำเนินการที่มีราคาแพงมาก ใช้พร็อกซีเพื่อชะลอกระบวนการคัดลอกนี้
ตัวอย่างเช่น: เรามีคอลเลกชันขนาดใหญ่เช่น Hashtable และลูกค้าจำนวนมากจะเข้าถึงได้พร้อมกันในเวลาเดียวกัน หนึ่งในลูกค้าพิเศษต้องดำเนินการเก็บข้อมูลอย่างต่อเนื่องและในเวลานี้ลูกค้าอื่น ๆ จะต้องไม่เพิ่มหรือลบสิ่งต่าง ๆ ลงในแฮช
ทางออกที่ตรงที่สุดคือ: ใช้ล็อคคอลเลกชันให้ไคลเอนต์พิเศษนี้ได้รับล็อคนี้ดำเนินการเก็บข้อมูลอย่างต่อเนื่องจากนั้นปล่อยล็อค
การคัดลอกรหัสมีดังนี้:
โมฆะสาธารณะ fofetches (hashtable ht) {
ซิงโครไนซ์ (ht) {
// การดำเนินการรับข้อมูลอย่างต่อเนื่องเฉพาะ ...
-
-
อย่างไรก็ตามวิธีนี้อาจล็อคคอลเลกชันเป็นเวลานานและลูกค้าอื่น ๆ จะไม่สามารถเข้าถึงคอลเลกชันในช่วงเวลานี้ได้
ทางออกที่สองคือการปิดคอลเลกชันจากนั้นให้ข้อมูลต่อเนื่องได้รับการดำเนินการรวบรวมสำหรับโคลน โซลูชันนี้ตั้งอยู่บนความจริงที่ว่าคอลเลกชันนั้นเป็นไปได้และต้องมีวิธีการให้โคลนลึก Hashtable ให้วิธีการโคลนของตัวเอง แต่ไม่ใช่โคลนของวัตถุคีย์และค่า
การคัดลอกรหัสมีดังนี้:
โมฆะสาธารณะ fofetches (hashtable ht) {
hashttable newht = (hashtable) ht.clone ();
-
ปัญหามาอีกครั้ง
โซลูชันสุดท้าย: เราสามารถรอได้จนกว่าลูกค้ารายอื่นจะทำการปรับเปลี่ยนก่อนที่จะทำการโคลนนิ่งนั่นคือไคลเอนต์พิเศษนี้ทำการดำเนินการชุดข้อมูลการเก็บข้อมูลครั้งแรกโดยเรียกวิธีที่เรียกว่าโคลน แต่ในความเป็นจริงไม่มีการคัดลอกวัตถุจริง ๆ จนกว่าลูกค้ารายอื่นจะแก้ไขการรวบรวมวัตถุ
ใช้โซลูชันนี้โดยใช้พร็อกซีซึ่งเป็นการดำเนินการคัดลอก-เขียน
พร็อกซีมีแอพพลิเคชั่นที่หลากหลาย