ฉันจะรวม 'Command' และ 'Composite' เพื่อจำลองการหน่วงเวลาได้อย่างไร


9

ในแบบฝึกหัดการเรียนรู้ (ฉันไม่ได้อยู่ที่โรงเรียน - เป็นเพียงแค่ชายแก่ที่พยายามเรียนรู้สิ่งใหม่) ฉันพยายามเขียนการจำลองประตูตรรกะที่รวมเอาการหน่วงเวลาไว้ ผู้ใช้ควรสามารถจัดกลุ่มประตูด้วยกันเพื่อสร้างวัตถุระดับสูงขึ้น

ฉันต้องการใช้รูปแบบการออกแบบกับปัญหาของฉัน แต่ฉันมีเวลายาก

ฉันอ่านHead First Design Patternsและฉันเห็นว่ารูปแบบคำสั่งเป็นวิธีที่ดีในการจำลองพัลส์ไฟฟ้าผ่านวงจรที่มีความล่าช้า ฉันยังเห็นว่ารูปแบบคอมโพสิตเป็นวิธีที่ดีในการจำลองหน่วยซ้อนกัน ฉันไม่รู้วิธีผสมสองอย่างนี้เข้าด้วยกัน

กล่าวอีกนัยหนึ่งเมื่อฉันวนผ่านประตูของฉันฉันเห็นว่าประตู 'x' ควรยิง มันมีความล่าช้า 15 นาโนวินาทีดังนั้นฉันจึงสร้างคำสั่งด้วยการประทับเวลา 15 ns จากเวลาเล่นเกมปัจจุบัน ผู้แจกจ่ายอยู่ที่ไหน ในตัวอย่างของร้านอาหารที่มีคำสั่งเป็น 'สั่งซื้อ' พนักงานเสิร์ฟและผู้ปรุงแต่ละคนส่งคำสั่งและมีตัวเลือกในการแนะนำการหน่วงเวลา ถ้าฉันมีประตู 'ประกอบ' มันจะมีดิสแพตเชอร์ของตัวเองหรือไม่ ฉันต้องใช้ซิงเกิลตันเพื่อจัดการคิวหรือไม่

ฉันอ่านสิ่งที่ฉันสามารถหาได้ แต่ฉันยังต้องการแรงผลักดันในทิศทางที่ถูกต้อง:


9
รูปแบบเป็นเครื่องมือ ไม่มีใครเอาไขควงและไขควงและคิดว่าฉันจะสร้างบ้าน ให้เริ่มสร้างบ้านและตระหนักว่าค้อนจะทำให้งานง่ายขึ้นได้อย่างไร

นั่นไม่ได้ตอบคำถามของฉันอย่างแน่นอน ฉันมีแอพพลิเคชั่น Java ขนาดใหญ่ที่สร้างขึ้นแล้วซึ่งส่งข้อความจากประตูหนึ่งไปยังอีกหนึ่งประตู อย่างไรก็ตามฉันพยายามรวมความล่าช้าในการแพร่กระจายและฉันพบว่าการออกแบบแอปพลิเคชันของฉันไม่สามารถจัดการได้อย่างง่ายดาย ฉันหวังว่ารูปแบบการออกแบบจะช่วยได้ ...
Neil Mussett

4
คุณกำลังมองหาการจำลองเหตุการณ์ที่ไม่ต่อเนื่องเช่นcronแต่ไม่มีเวลา 'จริง' สร้างสิ่งนี้แล้วจำได้ว่า "โอ้ฉันกำลังสร้างคอมโพสิตที่นี่ - ฉันรู้วิธีการทำเช่นนั้น" แทนที่จะไปและมองหาวิธีที่จะลิ่มคอมโพสิตลงในโซลูชัน

1
โดยเฉพาะอย่างยิ่งคุณอาจพบโครงสร้างข้อมูลที่มีประสิทธิภาพสำหรับชุดเหตุการณ์จำลองจากการสื่อสารของ ACM สิงหาคม 1977 เล่ม 20 จำนวน 8 มีประโยชน์มาก (การค้นหา google สำหรับชื่อนี้ควรดึงไฟล์ pdf ขึ้นมา - ฉันมีปัญหาในการเชื่อมโยงไปยัง มัน) - มันต้องผ่านแนวคิดของการใช้โครงสร้างข้อมูลที่มีการปรับปรุงอย่างมีนัยสำคัญมากกว่ารายการที่จัดทำดัชนี

1
นี่คือลิงก์ไปยังกระดาษ ACM ที่โฮสต์ที่ citeseerx
แฟรงค์

คำตอบ:


1

คุณอาจต้องการดูตัวอย่างจากการเขียนโปรแกรมใน Scalaเนื่องจากมีตัวจำลองที่ทำในสิ่งที่คุณพยายามทำใน Java:

http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6

โดยดูที่วิธีการของพวกเขาคุณอาจพบวิธีการเปลี่ยนโปรแกรมของคุณเพื่อให้ได้พฤติกรรมที่คุณต้องการ

คุณกล่าวว่าคุณไม่สามารถเพิ่มได้อย่างง่ายดายดังนั้นทำไมไม่อธิบายว่าแนวทางของคุณคืออะไรและความยากลำบากที่คุณพบคืออะไรเพื่อให้คนอื่นสามารถให้คำแนะนำบางอย่างที่คุณอาจไม่ได้พิจารณา

ดังที่ได้กล่าวมาแล้วรูปแบบการออกแบบเป็นวิธีที่จะพูดคุยเกี่ยวกับสิ่งที่โค้ดของคุณกำลังทำอยู่เหมือนเป็นการจดชวเลข

ความล่าช้าในการเผยแพร่โดยทั่วไปไม่ควรยาก

คุณสามารถมีคลาสฐานที่เป็นGateและในเธอทำให้ล่าช้า

ประตูทั้งหมดขยายจากนี้และตั้งค่าการหน่วงเวลาจริง

ตอนนี้เมื่อคุณกำลังติดตามสัญญาณเมื่ออยู่ที่ประตูเธรดนั้นอาจเข้าสู่การหน่วงเวลาการจำลอง แต่นี่ก็หมายความว่าคุณต้องแมปตามเวลาจริงกับเวลาจำลองของคุณเนื่องจากตัวจำลองของคุณจะช้ากว่าระบบจริง อยากจะเป็น.

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

นี่จะคล้ายกับลูปเกม


0

กล่าวอีกนัยหนึ่งเมื่อฉันวนผ่านประตูของฉันฉันเห็นว่าประตู 'x' ควรยิง

จากนั้นคุณไม่ได้ใช้รูปแบบคำสั่ง

ถ้าฉันมีประตู 'ประกอบ' มันจะมีดิสแพตเชอร์ของตัวเองหรือไม่

ท่านที่รักไม่มี จุดรวมของรูปแบบผสมคือคุณสามารถจัดหาวัตถุประกอบให้กับสถานที่ที่คาดหวังเพียงวัตถุเดียว วิธีนี้ช่วยให้คุณสามารถเขียนพฤติกรรมได้อย่างมีสติ

ฉันต้องใช้ซิงเกิลตันเพื่อจัดการคิวหรือไม่

ไม่มีทาง. คุณมีพ่อครัวเพียงคนเดียวและพนักงานเสิร์ฟหญิงคนหนึ่งในโลกใบนี้หรือไม่? พวกเขามีห้องครัวเดียวหรือไม่

การผสมคำสั่งและรูปแบบคอมโพสิตค่อนข้างตรงไปตรงมา คุณมีอินเตอร์เฟสที่แสดงถึงคำสั่ง แต่ละคำสั่งที่เป็นรูปธรรมสามารถแทนที่ (หรือตอบสนองในภาษาที่ไม่ใช่มรดก) อินเตอร์เฟซที่จะให้พฤติกรรมบางอย่าง ความล่าช้าของคุณเป็นพฤติกรรมที่เรียบง่ายอย่างหนึ่ง

รูปแบบผสมให้วัตถุ / พฤติกรรมสองรายการขึ้นไปด้านหลังอินเทอร์เฟซเดียว การใช้งานที่ง่ายที่สุดสำหรับตัวอย่างนี้จะเป็นคำสั่งรวมที่รับอีกสองคำสั่งจากนั้นเมื่อบอกให้เรียกใช้งานจะทริกเกอร์คำสั่งที่เก็บไว้สองคำสั่ง วิธีนี้คุณสามารถใช้คำสั่ง 'delay' แบบแยกของคุณและคำสั่งอื่น ๆ โดยพลการเพื่อสร้างคำสั่งล่าช้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.