ในการใช้รูปแบบสถานะและนโยบายอย่างถูกต้องในแอปพลิเคชัน Java นักพัฒนาจำเป็นต้องทราบความแตกต่างระหว่างสองรูปแบบอย่างชัดเจน แม้ว่าโครงสร้างของโหมดรัฐและโหมดนโยบายจะคล้ายกันมาก แต่พวกเขายังทำตามหลักการของการเปิดและปิดซึ่งเป็นตัวแทนของ 'O' ของหลักการออกแบบที่เป็นของแข็ง แต่ความตั้งใจของพวกเขานั้นแตกต่างกันอย่างสิ้นเชิง รูปแบบนโยบายใน Java คือการห่อหุ้มชุดอัลกอริทึมที่เกี่ยวข้องให้ผู้โทรมีความยืดหยุ่นในการรันไทม์ ผู้โทรสามารถเลือกอัลกอริทึมที่แตกต่างกันที่รันไทม์โดยไม่ต้องแก้ไขคลาสบริบทโดยใช้นโยบาย ตัวอย่างคลาสสิกของการใช้รูปแบบนโยบายรวมถึงการใช้อัลกอริทึมการเข้ารหัสอัลกอริทึมการบีบอัดและอัลกอริทึมการเรียงลำดับ ในทางกลับกันโหมดสถานะใช้วัตถุเพื่อแสดงพฤติกรรมที่แตกต่างกันในสถานะที่แตกต่างกัน วัตถุในโลกแห่งความเป็นจริงก็มีรัฐเช่นกันและพวกเขาจะทำงานแตกต่างกันไปตามรัฐของพวกเขา ตัวอย่างเช่นตู้หยอดเหรียญสามารถขายสินค้าในสถานะ Hascoin เท่านั้น หากคุณไม่ได้ใส่เหรียญในนั้นจะไม่ขายสินค้า ตอนนี้คุณสามารถเห็นความแตกต่างระหว่างโหมดนโยบายและโหมดสถานะได้อย่างชัดเจนวัตถุประสงค์ของพวกเขาแตกต่างกัน โหมดรัฐช่วยให้วัตถุจัดการสถานะของตนในขณะที่โหมดนโยบายช่วยให้ลูกค้าเลือกพฤติกรรมที่แตกต่างกัน ความแตกต่างอีกอย่างที่ไม่ง่ายที่จะเห็นคือผู้ที่ขับเคลื่อนการเปลี่ยนแปลงพฤติกรรม ในโหมดนโยบายมันเป็นลูกค้าที่ขับเคลื่อนด้วยซึ่งให้นโยบายที่แตกต่างกันสำหรับข้อมูลบริบท ในโหมดรัฐการย้ายถิ่นของรัฐได้รับการจัดการโดยบริบทหรือวัตถุรัฐเอง ในทำนองเดียวกันหากคุณปรับเปลี่ยนสถานะในวัตถุสถานะจะต้องมีการอ้างอิงถึงบริบทซึ่งหมายความว่าสำหรับเครื่องหยอดเหรียญมันสามารถเรียกวิธีการตั้งค่าเพื่อแก้ไขสถานะบริบทปัจจุบัน ในทางกลับกันวัตถุนโยบายไม่ได้อ้างอิงถึงบริบทและลูกค้าผ่านนโยบายที่เลือกไปยังบริบท กลยุทธ์และรูปแบบของรัฐเป็นคำถามสัมภาษณ์ที่ง่ายที่สุดเกี่ยวกับรูปแบบการออกแบบ Java ในบทความนี้เกี่ยวกับรูปแบบการออกแบบ Java เราจะแนะนำรายละเอียดนี้ เราจะสำรวจความเหมือนและความแตกต่างระหว่างสองโหมดซึ่งจะช่วยปรับปรุงความเข้าใจของคุณเกี่ยวกับสองโหมด
ความคล้ายคลึงกันระหว่างโหมดสถานะและโหมดนโยบาย:
หากคุณดูกราฟ UML ของรูปแบบนโยบายและรูปแบบสถานะพวกเขาจะดูคล้ายกันมาก ในโหมดสถานะวัตถุที่ใช้วัตถุสถานะเพื่อเปลี่ยนพฤติกรรมเรียกว่าวัตถุบริบท ในทำนองเดียวกันในโหมดกลยุทธ์วัตถุที่ใช้วัตถุกลยุทธ์เพื่อเปลี่ยนพฤติกรรมเป็นวัตถุบริบท โปรดจำไว้ว่าลูกค้าโต้ตอบกับวัตถุบริบท ในโหมดสถานะพร็อกซีบริบทวิธีการเรียกของวัตถุสถานะ วัตถุปัจจุบันในบริบทคือวัตถุสถานะเฉพาะ ในโหมดนโยบายบริบทดำเนินการวัตถุนโยบายด้วย วัตถุนี้จะถูกส่งผ่านเป็นพารามิเตอร์หรือมีให้เมื่อสร้างวัตถุบริบท
ลองมาดูความคล้ายคลึงกันระหว่างรูปแบบการออกแบบจาวาหลักสองรูปแบบนี้:
ทั้งโหมดรัฐและโหมดนโยบายนั้นง่ายต่อการเพิ่มสถานะหรือนโยบายใหม่โดยไม่ส่งผลกระทบต่อการใช้งานของพวกเขาทั้งสองปฏิบัติตามหลักการออกแบบของการเปิดและปิดซึ่งหมายความว่าการออกแบบของคุณเปิดให้ส่วนขยายและปิดการดัดแปลง ในสองโหมดนี้บริบทจะถูกปิดเพื่อการแก้ไขและเพิ่มสถานะใหม่หรือนโยบาย คุณไม่จำเป็นต้องแก้ไขวัตถุบริบทในสถานะอื่นหรือต้องการการเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้น เช่นเดียวกับวัตถุบริบทในโหมดสถานะจะมีสถานะเริ่มต้นบริบทในโหมดนโยบายมักจะมีนโยบายเริ่มต้นเช่นกัน
โหมดสถานะห่อหุ้มพฤติกรรมที่แตกต่างกันในวิธีการของวัตถุสถานะที่แตกต่างกันในขณะที่โหมดนโยบายสรุปพฤติกรรมที่แตกต่างกันในวิธีของวัตถุนโยบายที่แตกต่างกัน
รูปแบบทั้งสองขึ้นอยู่กับคลาสย่อยที่เฉพาะเจาะจงเพื่อให้ได้พฤติกรรมที่เฉพาะเจาะจง แต่ละนโยบายเฉพาะขยายจากคลาสนโยบายนามธรรมและแต่ละรัฐยังเป็นอินเทอร์เฟซที่ใช้เพื่อเป็นตัวแทนสถานะหรือคลาสย่อยของคลาสนามธรรม
อินสแตนซ์ของโหมดสถานะ
WindowState ชั้นเรียนสาธารณะ {String String Private String; Public WindowState (String StateValue) {this.stateValue = StateValue; } สตริงสาธารณะ getStateValue () {return stateValue; } โมฆะสาธารณะ setStateValue (String stateValue) {this.stateValue = stateValue; } มือถือโมฆะสาธารณะ () { /** ทำการดำเนินการที่แตกต่างกันตามสถานะที่แตกต่างกันจากนั้นสลับสถานะ* / if ("window" .Equals (stateValue)) {switchWindow (); this.statevalue = "เต็มหน้าจอ"; } อื่นถ้า ("Fullscreen" .Equals (StateValue)) {switchfullscreen (); this.statevalue = "หน้าต่าง"; }} โมฆะส่วนตัว switchWindow () {system.out.println ("สลับไปที่สถานะหน้าต่าง"); } โมฆะส่วนตัว switchfullscreen () {system.out.println ("เปลี่ยนเป็นสถานะหน้าจอเต็ม"); - / *** การใช้สถานะ*/ คลาสสาธารณะ WindowContext {สถานะหน้าต่างส่วนตัว; สาธารณะ WindowContext (สถานะ WindowState) {this.state = state; } Public WindowState GetState () {return state; } โมฆะสาธารณะ setState (สถานะ WindowState) {this.state = state; } โมฆะสาธารณะ switchState () {this.state.handle (); - /** สถานะ (สถานะ) โหมดพฤติกรรม* เปลี่ยนทั้งสถานะของวัตถุและพฤติกรรมของวัตถุ* ตามสถานะการเปลี่ยนพฤติกรรม*/ การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {/** มีเพียงสองสถานะในตัวอย่างนี้ Context.switchstate (); Context.switchstate (); Context.switchstate (); Context.switchstate (); Context.switchstate (); Context.switchstate (); -พิมพ์
สลับไปที่สถานะหน้าต่างเป็นสถานะเต็มหน้าจอไปยังสถานะหน้าต่างเป็นสถานะเต็มหน้าจอ
ตัวอย่างโหมดนโยบาย
/ *** โปรโมชั่นผลิตภัณฑ์* หมวดหมู่นี้คือ: การรวบรวมเงินสด*/ ส่วนต่อประสานสาธารณะ icashsuper {Double AcceptCash (Double Money); - / ** * คอลเลกชันเงินสดปกติ * @author Stone * */ คลาสสาธารณะ cashnormal ใช้ icashsuper {@Override สาธารณะ Double AcceptCash (เงินสองเท่า) {คืนเงิน; - / ** * เก็บเงินสดที่ส่วนลด * @author Stone * */ Class Public Cashrebate ใช้ icashsuper {การคืนเงินสองครั้งส่วนตัว; // ส่วนลด cashrebate สาธารณะ (การคืนเงินสองครั้ง) {this.rebate = การคืนเงิน; } @Override Public Double AcceptCash (Double Money) {ส่งคืน BigDecimal ใหม่ (เงิน * คืน / 10) .SetScale (2, bigDecimal.round_half_up) .DoubleValue (); - / ** * เงินคืนเงินสดด้วยเงินสด * @author Stone * */ Class Public Cashreturn ใช้ ICASHSUPER {MoneyCondition ส่วนตัว; // เงินคืนจำนวนเงินขั้นต่ำส่วนตัวคืนวันส่วนตัว; // จำนวนเงินคืนเงินสดสาธารณะ (double moneycondition, double returnmoney) {this.moneycondition = moneycondition; this.returnMoney = returnMoney; } @Override Public Double AcceptCash (เงินสองเท่า) {// การคืนเงินหลายครั้งถ้า (money> = moneycondition) {คืนเงิน - Math.floor (money/moneycondition) * returnmoney; } else {คืนเงิน; - / *** ดำเนินการพฤติกรรมที่สอดคล้องกันตามคลาสนโยบายที่ผ่านไป*/ คลาสสาธารณะ CashContext {ส่วนตัว ICASHSUPER CASHER; Public CashContext () {} Public CashContext (IcashSuper Casher) {this.casher = Casher; } โมฆะสาธารณะ setCasher (IcashSuper Casher) {this.casher = casher; } // ตามวัตถุนโยบายเฉพาะพฤติกรรมอัลกอริทึมของการเรียกมันว่าสาธารณะ Double AcceptCash (เงินสองเท่า) {คืนสิ่งนี้ casher.acceptCash (เงิน); - การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (String [] args) {double money = 998; // ราคาเดิม CashContext CashContext = ใหม่ CashContext (ใหม่ cashnormal ()); System.out.println ("ราคาเดิม:" + cashcontext.acceptCash (เงิน)); // กลยุทธ์ทั่วไป CashContext.setCasher (ใหม่ CashRebate (8.5)); System.out.println ("85% ปิด:" + cashcontext.acceptCash (เงิน)); // กลยุทธ์ส่วนลด 85% จาก CashContext.setCasher (Cashreturn ใหม่ (300, 50)); System.out.println ("return 50 ถ้ามากกว่า 300:" + cashcontext.acceptCash (เงิน)); // กลยุทธ์การคืนเงิน 50 ถ้ามากกว่า 300}}}พิมพ์
ราคาเดิม: 998.0 85% ปิด: 848.3 การคืนเงินสำหรับ 50: 848.0 มากกว่า 300
ความแตกต่างระหว่างโหมดนโยบายและโหมดสถานะ
เราได้เรียนรู้ว่าทั้งสองรูปแบบมีโครงสร้างคล้ายกันมาก แต่พวกเขายังมีส่วนต่าง ๆ มาดูความแตกต่างที่สำคัญบางอย่างระหว่างกัน
นี่คือความแตกต่างทั้งหมดระหว่างรูปแบบนโยบายและรูปแบบของรัฐใน Java อย่างที่ฉันพูดพวกเขาดูคล้ายกันมากในไดอะแกรม UML ทั้งสองปฏิบัติตามหลักการของการเปิดและปิดและการห่อหุ้มพฤติกรรม โหมดนโยบายใช้เพื่อห่อหุ้มอัลกอริทึมหรือนโยบาย มันจะถูกจัดเตรียมให้กับวัตถุบริบทเป็นพารามิเตอร์หรือวัตถุรวมที่รันไทม์ในขณะที่โหมดสถานะจะใช้ในการจัดการการโยกย้ายสถานะ