تصف هذه المقالة استخدام وضع الزوار لحل مشكلة مخطط الهيكل الهرمي للشركة. شاركه للرجوع إليه ، على النحو التالي:
1. تعريف نمط
وضع الزوار: يمثل عملية تعمل على كل عنصر في بنية كائن. يسمح للمستخدم بتحديد عمليات جديدة تعمل على هذه العناصر دون تغيير فئة كل عنصر.
2. أمثلة نموذجية
1 تحليل نمط
نحن نقترض التسلسل الهرمي للشركة لتوضيح هذا النموذج.
2 وضع الزوار مخطط فئة ثابتة
3 أمثلة رمز
3.1 الموظفين التجريديين
package com.demo.structure ؛ import com.demo.visitor.ivisitor ؛/** * مجردة الموظف فئة * * Author * */موظفي الفئة التجريدية العامة {// رقم الموظف المحمي No ؛ // اسم الموظف اسم السلسلة المحمية ؛ // موقف السلسلة المحمية ؛ // راتب الراتب العائم. // بطول الممتلكات الخاصة بطول int الخاص ؛ . this.name = name ؛ this.position = الموضع ؛ هذا. // احسب طول البايت الكلي this.length += (no == null || ".equals (no.trim ()))؟ 0: No.GetBytes (). الطول ؛ this.length += (name == null || "" .equals (name.trim ()))؟ 0: position.getBytes (). الطول ؛ this.length += (الموضع == null || "" .equals (position.trim ()))؟ 0: position.getBytes (). الطول ؛ this.length += string.valueof (راتب) .getBytes (). الطول ؛ } // الحصول على معلومات المستخدم الأساسية void printuserbaseinfo () {system.out.println ("-| } // إضافة معلومات الموظف المجردة المجردة إضافة (موظفي الموظفين) ؛ // حذف موظفي الموظفين التجريديين العامين (سلسلة رقم) ؛ // استقبال كائن الزائر Public Abstract Void قبول (Ivisitor Postitor) ؛ السلسلة العامة getno () {return no ؛ } public void setno (سلسلة no) {this.no = no ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } السلسلة العامة getPosition () {return position ؛ } setPosition public void (موضع السلسلة) {this.position = position ؛ } getSalary getSalary () {راتب العودة ؛ } setSalary public void (راتب تعويم) {this.salary = salary ؛ }}3.2 مدير
package com.demo.structure ؛ import java.util.arraylist ؛ استيراد com.demo.visitor.ivisitor ؛/** * مدير (شخص مع موظفين آخرين تحت قيادتهم) * * @Author * */مدير الطبقة العامة يمتد الموظفين {// متجر معلومات حول الموظفين النهائيين arraylist <Staft> arraylist = new ArrayList <) . } / *** إضافة موظف* / Override public void add (موظفي الموظفين) {this.arrayList.add (staff) ؛ } / *** حذف معلومات الموظف* / Override Public Remaint (سلسلة NO) {موظفي الموظفين = null ؛ if (no! = null &&! " } if (no.equals (this.arrayList.get (i) .getno ())) {staff = this.arrayList.Remove (i) ؛ استراحة؛ }}} موظفي الإرجاع ؛ }. . } // استلام كائن الزائر this.arrayList.get (i) .accept (زائر) ؛ }}}3.3 الموظفين العاديين
package com.demo.structure ؛ import com.demo.visitor.ivisitor ؛/** * الموظفين العاديين (الأشخاص الحقيقيون العاملون) * * Author * */موظفو الطبقة العامة يمتد الموظفين {// إنشاء الموظفين العامين (سلسلة لا ، اسم السلسلة ، موقف السلسلة ، راتب العائمة) } / *** إضافة معلومات الموظف* / Override public void add (موظفي الموظفين) {return ؛ } / *** حذف معلومات الموظف* / Override Public Amstrict Remove (سلسلة NO) {// return null مباشرة إلى NULL ؛ }. }}3.4 مستهزف واجهة الزوار
package com.demo.visitor ؛ import com.demo.structure.employees ؛ import com.demo.structure.manager ؛/** * interface jostitive * * author * */public interface ivisitor {// access manager public void visit (manager manager) ؛ // الوصول إلى الموظفين العاديين زيارة باطلة عامة (موظفين الموظفين) ؛}3.5 الموظف المعلومات الأساسية للزوار printbaseinfovistor
package com.demo.visitor ؛ import com.demo.structure.employees ؛ import com.demo.structure ؛/*** طباعة زائر المعلومات الأساسية** author**/public class printbaseinfovisitor تنفذ ivisitor {/*** combor escound absist*/public void virod) {system.out.out. MANGER.PRINTUSERBASEINFO () ؛ } / *** الوصول إلى كائن الموظف العادي* / زيارة باطلة عامة (موظفون الموظفون) {system.out.print ("- الموظف العام:") ؛ الموظفين. printuserBaseInfo () ؛ }}3.6 إنشاء واجهة زائر لتوضيح رواتب الموظفين - isalaryvistor
حزمة com.demo.visitor ؛/** * حساب زائر الراتب * * Author * */الواجهة العامة isalaryvisitor . // إحصائيات جميع الموظفين راتب الفراغ العام printtotalsalary () ؛}
3.7 إحصاءات راتب الموظفين والزوار لتحقيق salaryvistor
package com.demo.visitor ؛ import com.demo.structure.employees ؛ import com.demo.structure.manager ؛/** * تنفيذ محدد لحساب رواتب زائر المرتب * * Author * */public class salaryvisitor ينفذ isalaryvisitor // إجمالي راتب الموظفين العاديين العائمة العائمة الموظفين ؛ SalaryVisitor () {managerersalary = 0 ؛ الموظفين = 0 ؛ }. }. }. }. }. }}3.8 اختبار العميل عميل
package com.demo ؛ import com.demo.structure.employees ؛ import com.demo.structure.manager ؛ import com.demo.structure.staff ؛ import com.demo.visitor.printbaseinfovisitor ؛ evstruction com.demo args */ public static void main (string [] args) {// Company Ceo Staff Boss = New Manager ("1" ، "Big Boss" ، "CEO" ، 100000) ؛ / *** لدى المدير التنفيذي العديد من مديري الأقسام*/// مديري قسم التمويل ، مدير التمويل ، المدير العام = "11" ، "الرئيس تشانغ" ، "مدير المالية" ، 60000) ؛ // مدير إدارة الموارد البشرية ، موظفي الموظفين = مدير جديد ("12" ، "الرئيس وانغ" ، "مدير الرئيس" ، 60000) ؛ . / *** هناك أيضًا مساعدين والعديد من المشرفين في القسم الفني* //// قسم الموظفين المساعدين التقنيين = مدير جديد ("1301" ، "مساعد وانغ" ، "مساعد القسم" ، 20000) ؛ . / ** * المدير الفني DeptManager1 يوجد مهندسون برمجيات (الشخص الذي ينتهي العمل) */ SoftwareEngineer1 = موظفين جدد ("1302001" ، "Zhang San" ، "Engineer" ، 5000) ؛ SoftwareEngineer2 = موظفون جدد ("1302002" ، "Li Si" ، "Software Engineer" ، 5500) ؛ SoftwareEngineer3 = موظفين جدد ("1302003" ، "Wang Wu" ، "Software Engineer" ، 4500) ؛ // إضافة معلومات الموظف للمشرف الفني 1 deptmanager1.add (SoftwareEngineer1) ؛ deptmanager1.add (SoftwareEngineer2) ؛ DeptManager1.Add (SoftwareEngineer3) ؛ . // إضافة: مساعد القسم ، المدير الفني 1 والمدير الفني 2 TechnicalManager.Add (DeptAssistant) ؛ TechnicalManager.add (DeptManager1) ؛ TechnicalManager.Add (DeptManager2) ؛ // مدير التسويق stustr MarketingManager = مدير جديد ("14" ، "Mr. Wu" ، "Market Manager" ، 60000) ؛ // إضافة إلى المدير التنفيذي: مدير قسم المالية ، مدير إدارة الموارد البشرية ، مدير القسم الفني ومدير التسويق Boss.Add (Financemanager) ؛ Boss.Add (PersonnelManager) ؛ Boss.Add (TechnicalManager) ؛ Boss.Add (MarketingManager) ؛ // معلومات الرئيس التنفيذي للطباعة // boss.printuserBaseInfo () ؛ // طباعة مدرب معلومات موظف الرئيس التنفيذي. / *** راتب الموظف الإحصائي*// إنشاء زائر راتب الموظف الإحصائي SalaryVisitor زائر = SalaryVisitor جديد () ؛ // دعنا يقبل Big Boss Boss.accept (زائر) ؛ // مدير إحصاء الرواتب الزائر. // زائر رواتب الموظف العام. // جميع إحصاءات رواتب الموظف. }}4 نتائج التشغيل
- المدير: - | 1 Big Boss Ceo 100000.0
- المدير: - | 11 مدير قسم المالية في زانغ 60000.0
- المدير: - | 12 مدير إدارة الموارد البشرية في وانغ وانغ 60000.0
- المدير: - | 13 مدير قسم التقنية العام في تشن 60000.0
- المدير: - | 1301 مساعد قسم Wang Assistant 20000.0
- المدير: - | 1302 المشرف 1 المشرف الفني 30000.0
- عامة الموظفين: - | 1302001 Zhang San Software Engineer 5000.0
- عامة الموظفين: - | 1302002 LI SI Software Engineer 5500.0
- عامة الموظفين: - | 1302003 Wang Wu Software Engineer 4500.0
- المدير: - | 1303 المشرف 2 المشرف الفني 30000.0
- المدير: - | 14 مدير التسويق العام WU 60000.0
إجمالي راتب المدير: 420،000.0
إجمالي راتب الموظفين العامين: 15000.0
إجمالي راتب الموظف: 435،000.0
ثالثا. مبادئ تصميم هذا النمط
1 مبدأ "Open-Close"
2 مبدأ المسؤولية الفردية
4. استخدام المناسبات
1 إذا قمت بتضمين العديد من الأنواع المختلفة من الكائنات في بنية كائن ، فإنها تحتوي على واجهات مختلفة ، وتريد تنفيذ بعض العمليات التي تعتمد على فئات محددة على هذه الكائنات المختلفة.
2 تحتاج إلى إجراء العديد من العمليات المختلفة وغير ذات الصلة على الكائنات في بنية كائن ، وتريد تجنب ربط هذه العمليات بفئات هذه الكائنات. يسمح وضع الزائر أن تكون العمليات ذات الصلة مركزية ومعرفة بشكل منفصل في الفصل.
3 عندما تتم مشاركة هيكل الكائن هذا من قبل العديد من التطبيقات ، استخدم وضع الزائر للسماح لكل تطبيق باحتواء العمليات التي يجب استخدامها فقط.
4 نادراً ما تتغير الفئات التي تحدد بنية الكائن ، ولكن غالبًا ما تكون عمليات جديدة مطلوبة في هذا الهيكل.
5. وضع الزوار مخطط فئة ثابتة
لمزيد من المحتوى المتعلق بـ Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "بنية بيانات Java وبرنامج تعليمي الخوارزمية" ، "ملخص Tips Java Operation DOM" ، "ملخص ملف Java ونصائح تشغيل الدليل" و "ملخص نصائح Java Cache Operation Tips"
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.