คำจำกัดความ: กำหนดชุดของอัลกอริทึมห่อหุ้มแต่ละอัลกอริทึมและทำให้สามารถใช้แทนกันได้
ประเภท: รูปแบบพฤติกรรม
แผนภาพชั้นเรียน:
รูปแบบนโยบายคือการห่อหุ้มอัลกอริทึมการห่อหุ้มชุดอัลกอริทึมลงในคลาสที่สอดคล้องกันและคลาสเหล่านี้ใช้อินเทอร์เฟซเดียวกันและสามารถแทนที่ได้ ในโหมดคลาสพฤติกรรมที่กล่าวถึงข้างต้นมีรูปแบบที่มุ่งเน้นไปที่การห่อหุ้มของอัลกอริทึม - โหมดวิธีแม่แบบ เมื่อเทียบกับแผนภาพคลาสคุณจะเห็นว่าความแตกต่างระหว่างโหมดนโยบายและโหมดวิธีการเทมเพลตนั้นมีเพียงบริบทของคลาสการห่อหุ้มแยกต่างหาก ความแตกต่างระหว่างมันกับโหมดวิธีการเทมเพลตคือ: ในโหมดวิธีการเทมเพลตร่างกายหลักของอัลกอริทึมการโทรอยู่ในคลาสแม่นามธรรมในขณะที่อยู่ในโหมดกลยุทธ์ร่างกายหลักของอัลกอริทึมการโทรถูกห่อหุ้มลงในบริบทของคลาส Encapsulation กลยุทธ์กลยุทธ์บทคัดย่อโดยทั่วไปเป็นอินเทอร์เฟซวัตถุประสงค์มีเพียงเพื่อกำหนดข้อกำหนดและโดยทั่วไปไม่มีตรรกะ อันที่จริงนี่เป็นเพียงการดำเนินการทั่วไป ในการเขียนโปรแกรมจริงเนื่องจากมีตรรกะที่เหมือนกันอย่างหลีกเลี่ยงไม่ได้ระหว่างคลาสการใช้งานกลยุทธ์เฉพาะแต่ละระดับเพื่อหลีกเลี่ยงรหัสที่ซ้ำกันเรามักจะใช้คลาสนามธรรมเพื่อเล่นบทบาทของกลยุทธ์และห่อหุ้มรหัสสาธารณะ ดังนั้นในหลาย ๆ สถานการณ์แอปพลิเคชันเงาของรูปแบบวิธีการเทมเพลตโดยทั่วไปจะเห็นในโหมดกลยุทธ์
โครงสร้างของรูปแบบนโยบาย
คลาส Encapsulation: หรือที่เรียกว่าบริบทการห่อหุ้มนโยบายรองคือการหลีกเลี่ยงการโทรโดยตรงไปยังนโยบายโดยโมดูลระดับสูง
กลยุทธ์บทคัดย่อ: โดยปกติจะเป็นอินเทอร์เฟซ เมื่อมีตรรกะที่ซ้ำกันในแต่ละคลาสการใช้งานคลาสนามธรรมจะถูกใช้เพื่อห่อหุ้มส่วนนี้ของรหัสทั่วไป ในเวลานี้รูปแบบนโยบายดูเหมือนรูปแบบวิธีการเทมเพลต
กลยุทธ์เฉพาะ: บทบาทกลยุทธ์เฉพาะมักจะดำเนินการโดยชุดของคลาสที่ห่อหุ้มด้วยอัลกอริทึมและคลาสเหล่านี้สามารถแทนที่ได้อย่างอิสระตามต้องการ
ตัวอย่างของสถานการณ์แอปพลิเคชัน:
Liu Bei กำลังจะแต่งงานกับภรรยาของเขาใน Jiangdong ก่อนออกเดินทาง Zhuge Liang ให้ Zhao Yun (ชายที่ดีที่สุด) สามลูกโดยบอกว่ามันจะแก้ปัญหาที่ยากโดยการแยกชิ้นส่วนตามความลับของสวรรค์ เฮ้สมมติว่ามันแก้ไขปัญหาใหญ่ได้จริงๆ ในท้ายที่สุดโจวหยูไปกับภรรยาของเขาแล้วก็ทำลายกองทหารของเขา ก่อนอื่นมาดูกันว่าฉากนี้เป็นอย่างไร
ก่อนอื่นมาพูดคุยเกี่ยวกับองค์ประกอบในฉากนี้: สามกลอุบายที่ฉลาดเคล็ดลับที่ฉลาดและเคล็ดลับที่ฉลาด เคล็ดลับที่ชาญฉลาดได้รับจากพี่เหลียง เคล็ดลับที่ฉลาดเป็นที่รู้จักกันทั่วไปว่าเป็นเคล็ดลับที่ฉลาด จากนั้น Zhao Yun เป็นคนงานที่ใช้กลอุบายที่ชาญฉลาดดำเนินการและชนะ วิธีแสดงสิ่งเหล่านี้โดยใช้โปรแกรม Java?
มาดูรูปก่อนไหม
เทคนิคทั้งสามเป็นสิ่งที่เหมือนกันดังนั้นเรามาเขียนอินเทอร์เฟซกันเถอะ:
แพ็คเกจ com.yangguangfu.strategy; /**** @author [email protected]: AFU* แรกกำหนดอินเทอร์เฟซกลยุทธ์ซึ่งเป็นอินเทอร์เฟซของสามเทคนิคที่ Zhuge Liang มอบให้กับ Zhao Yun */อินเทอร์เฟซสาธารณะ isstrategy {// ทุกเคล็ดลับเป็นอัลกอริทึมที่ปฏิบัติการได้ โมฆะสาธารณะดำเนินการ (); -
จากนั้นเขียนสามคลาสการใช้งานมีสามกลอุบายที่ฉลาด:
แผนการที่ชาญฉลาด: การมาถึงครั้งแรกใน WU:
แพ็คเกจ com.yangguangfu.strategy; /**** @author [email protected]: a fu* ขอให้นาย Qiao ช่วยได้ดังนั้นซุน Quan ไม่สามารถฆ่า Liu Bei ได้ */ Public Class Backdoor Enprements Istrategy {@Override โมฆะสาธารณะดำเนินการ () {System.out.println ("ค้นหาความช่วยเหลือของ Qiao Guo เก่าให้ Wu Guotai กดดัน Sun Quan เพื่อให้ Sun Quan ไม่สามารถฆ่า Liu Bei ... "); -
เคล็ดลับที่สอง: โปรดให้แสงสีเขียวของ Wu Guotai แล้วปล่อยมันไป:
แพ็คเกจ com.yangguangfu.strategy; /**** @author [email protected]: a fu* กรุณาให้ Wu Guotai แสงสีเขียว */ คลาสสาธารณะ Givengreenlight ใช้ strategy {@Override โมฆะสาธารณะใช้งาน () {system.out.println ("โปรดให้แสงสีเขียวของ Wu Guotai ปล่อยมันไป!"); -
ทักษะที่ 3: นางซันตัดด้านหลังและบล็อกผู้ติดตาม:
แพ็คเกจ com.yangguangfu.strategy; /**** @author [email protected]: afu* นางอาทิตย์ตัดด้านหลังและปิดกั้นผู้ติดตาม */ คลาสสาธารณะ blackenemy ใช้ strategy {@Override โมฆะสาธารณะทำงาน () {System.out.println ("Mrs. Sun ตัดด้านหลังบล็อกผู้ติดตาม ... "); -
โอเคทุกคนมีสามลูกเล่นดังนั้นจึงมีสถานที่ที่จะวางไว้ในเคล็ดลับ:
แพ็คเกจ com.yangguangfu.strategy; / ** * * @author [email protected]: AFU * */ บริบทคลาสสาธารณะ {กลยุทธ์ส่วนตัว istrategy; // constructor ซึ่งคุณต้องการใช้บริบทสาธารณะ (กลยุทธ์ istrategy) {this.strategy = กลยุทธ์; } โมฆะสาธารณะทำงาน () {this.strategy.operate (); -
จากนั้น Zhao หยุนก็ถือเคล็ดลับสามประการด้วยความกล้าหาญอย่างมากดึงชายชรา Liu Bei ซึ่งได้เข้าสู่กลุ่มผู้สูงอายุแล้วและต้องการแต่งงานกับหญิงสาวผู้บริสุทธิ์ได้แต่งงานกับภรรยาของเขา สวัสดีนับประสาว่าสามเทคนิคของพี่ชายเหลียงนั้นดีจริงๆ ดู:
แพ็คเกจ com.yangguangfu.strategy; คลาสสาธารณะ Zhaoyun { /*** Zhao Yun ปรากฏตัว ตามคำอธิบายของ Zhuge Liang ที่มีต่อเขาเขาได้แยกเทคนิคออกไป*/ โมฆะคงที่สาธารณะหลัก (String [] args) {บริบทบริบท; // เมื่อฉันมาถึง Wu ครั้งแรกฉันถอดประกอบ System.out.println ("-------------------------------------"); บริบท = บริบทใหม่ (ใหม่ backdoor ()); context.operate (); // ดำเนินการ System.out.println ("/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N // เมื่อ Liu Bei มีความสุขที่ไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจ ไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจ ไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจที่จะไม่เต็มใจ บริบท = บริบทใหม่ (ใหม่ blackenemy ()); context.operate (); // ถอดประกอบและดำเนินการ system.out.println (""/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N /N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N /N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N
ข้อดีและข้อเสียของโหมดนโยบายข้อดีหลักของโหมดนโยบายคือ:
คลาสนโยบายสามารถเปลี่ยนได้อย่างอิสระและเนื่องจากคลาสนโยบายใช้สิ่งที่เป็นนามธรรมเดียวกันจึงสามารถเปลี่ยนได้อย่างอิสระ
ขยายง่ายการเพิ่มนโยบายใหม่นั้นง่ายมากสำหรับรูปแบบนโยบายและโดยทั่วไปสามารถขยายได้โดยไม่ต้องเปลี่ยนรหัสต้นฉบับ
หลีกเลี่ยงการใช้หลายเงื่อนไข หากคุณไม่ได้ใช้โหมดนโยบายสำหรับอัลกอริทึมทั้งหมดต้องใช้งบเงื่อนไขเพื่อเชื่อมต่อและอัลกอริทึมที่จะใช้ผ่านการตัดสินตามเงื่อนไข ในบทความก่อนหน้านี้เรากล่าวว่าการใช้การตัดสินแบบมีเงื่อนไขหลายประการนั้นยากที่จะรักษา
มีข้อเสียหลักสองประการของรูปแบบกลยุทธ์:
การรักษาคลาสนโยบายต่าง ๆ จะนำค่าใช้จ่ายเพิ่มเติมมาสู่การพัฒนา คุณอาจมีประสบการณ์ในเรื่องนี้: โดยทั่วไปการพูดจำนวนคลาสนโยบายเกิน 5 ซึ่งเป็นปัญหามากขึ้น
คลาสนโยบายทั้งหมดจะต้องสัมผัสกับลูกค้า (ผู้โทร) เพราะมันขึ้นอยู่กับลูกค้าที่จะใช้ดังนั้นลูกค้าควรรู้ว่ามีนโยบายใดบ้างและเข้าใจความแตกต่างระหว่างนโยบายต่าง ๆ มิฉะนั้นผลที่ตามมาจะร้ายแรง ตัวอย่างเช่นมีรูปแบบกลยุทธ์สำหรับการเรียงลำดับอัลกอริทึมที่ให้อัลกอริทึมสาม: การเรียงลำดับอย่างรวดเร็วการเรียงลำดับฟองและเลือกการเรียงลำดับ ก่อนที่ลูกค้าจะใช้อัลกอริทึมเหล่านี้พวกเขาควรเข้าใจการประยุกต์ใช้อัลกอริทึมทั้งสามนี้หรือไม่? ตัวอย่างเช่นไคลเอนต์จำเป็นต้องใช้คอนเทนเนอร์ซึ่งดำเนินการโดยรายการและอาร์เรย์ที่เชื่อมโยง ลูกค้าจำเป็นต้องเข้าใจความแตกต่างระหว่างรายการและอาร์เรย์ที่เชื่อมโยงหรือไม่? ในเรื่องนี้มันตรงกันข้ามกับกฎหมาย Dimitian
สถานการณ์ที่เกี่ยวข้อง
เมื่อทำการออกแบบเชิงวัตถุคุณจะต้องคุ้นเคยกับรูปแบบนโยบายมากเพราะมันเป็นมรดกและความหลากหลายในวัตถุที่มุ่งเน้น หลังจากอ่านรหัสทั่วไปของรูปแบบนโยบายฉันคิดว่าแม้ว่าฉันจะไม่เคยได้ยินรูปแบบนโยบายมาก่อนฉันต้องใช้มันในระหว่างกระบวนการพัฒนาใช่ไหม? อย่างน้อยในสองสถานการณ์ต่อไปนี้คุณสามารถพิจารณาใช้แบบจำลองกลยุทธ์
ตรรกะหลักของหลายคลาสนั้นเหมือนกันและมีความแตกต่างเพียงเล็กน้อยในอัลกอริทึมและพฤติกรรมของตรรกะบางส่วน
มีพฤติกรรมหรืออัลกอริทึมที่คล้ายกันหลายอย่างและลูกค้าจำเป็นต้องตัดสินใจว่าจะใช้แบบใดแบบไดนามิกดังนั้นคุณสามารถใช้รูปแบบนโยบายเพื่อห่อหุ้มอัลกอริทึมเหล่านี้เพื่อให้ลูกค้าโทร
รูปแบบกลยุทธ์เป็นแบบจำลองที่ง่ายและใช้กันทั่วไป เมื่อเรากำลังพัฒนาเรามักจะใช้มันโดยเจตนาหรือไม่ได้ตั้งใจ โดยทั่วไปแล้วรูปแบบกลยุทธ์จะไม่ถูกใช้เพียงอย่างเดียวและเป็นเรื่องธรรมดาที่จะใช้มันในลักษณะผสมกับโหมดวิธีการเทมเพลตโหมดโรงงาน ฯลฯ