Artikel ini menjelaskan penggunaan mode pengunjung untuk menyelesaikan masalah diagram struktur hierarkis perusahaan. Bagikan untuk referensi Anda, sebagai berikut:
1. Definisi Pola
Mode pengunjung: mewakili operasi yang bertindak pada setiap elemen dalam struktur objek. Ini memungkinkan pengguna untuk mendefinisikan operasi baru yang bertindak pada elemen -elemen ini tanpa mengubah kelas setiap elemen.
2. Contoh model
1 analisis pola
Kami meminjam hierarki perusahaan untuk menggambarkan model ini.
2 mode pengunjung diagram kelas statis
3 contoh kode
3.1 Staf Abstrak
Paket com.demo.struktur; impor com.demo.visitor.ivisitor;/** * Abstrak kelas karyawan * * @author * */staf kelas abstrak publik {// nomor karyawan string yang dilindungi no; // nama karyawan nama string yang dilindungi; // posisi posisi string yang dilindungi; // gaji gaji pelampung yang dilindungi; // Private Properti Panjang String Private Int Length; // Metode Bangun Staf Publik (String No, String Name, Posisi String, Float Gaji) {this.no = no; this.name = name; this.position = position; this.salary = gaji; // Hitung total panjang byte this.length += (no == null || "" .Equals (No.Trim ()))? 0: No.GetBytes (). Panjang; this.length += (name == null || "" .Equals (name.trim ()))? 0: position.getbytes (). Panjang; this.length += (position == null || "" .Equals (position.trim ()))? 0: position.getbytes (). Panjang; this.length += string.ValueOf (gaji) .getBytes (). Panjang; } // Dapatkan informasi pengguna dasar public void printuserbaseInfo () {System.out.println ("-|" + this.no + "" + this.name + "" + this.position + "" + this.salary); } // Tambahkan informasi karyawan abstrak public abstrak add (staf staf); // hapus staf abstrak publik karyawan hapus (string no); // menerima objek pengunjung abstrak public void accept (pengunjung ivisitor); Public String getNo () {return no; } public void setNo (String no) {this.no = no; } public string getName () {return name; } public void setName (name string) {this.name = name; } public string getPosition () {Posisi return; } public void setPosition (posisi string) {this.position = position; } public float getSalary () {return gaji; } public void setSalary (float gaji) {this.salary = gaji; }}3.2 Manajer
package com.demo.structure;import java.util.ArrayList;import com.demo.visitor.IVisitor;/** * Manager (someone with other employees under their command) * * @author * */public class Manager extends Staff { // Store information about employees private final ArrayList<Staff> arrayList = new ArrayList<Staff>(); // Metode Bangun Manajer Publik (String No, Name String, Posisi String, Gaji Float) {Super (Tidak, Nama, Posisi, Gaji); } / *** Tambahkan karyawan* / @Override public void add (staf staf) {this.arraylist.add (staf); } / *** Hapus informasi karyawan* / @Override Staf publik Hapus (string no) {staf staf = null; if (tidak! = null &&! "". Equals (No.Trim ())) {for (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {lanjutkan; } if (No.Equals (this.arraylist.get (i) .getno ())) {staff = this.arraylist.remove (i); merusak; }}} mengembalikan staf; } // Terima Objek Pengunjung @Override public void Accept (IVisitor Visitor) {// Akses pengunjung Anda sendiri. Visit (ini); // melintasi berbagai objek elemen dalam daftar daftar dan menerima objek pengunjung untuk (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {lanjutkan; } // menerima objek pengunjung this.arraylist.get (i) .cepcept (pengunjung); }}}3.3 Karyawan biasa
Paket com.demo.struktur; impor com.demo.visitor.ivisitor;/** * Karyawan biasa (orang sungguhan yang bekerja) * @Author * */Karyawan kelas publik memperluas staf {// Metode Pegawai Publik (No. No, String Name, String Position, Float Gaji) {no, nama, posisi, gaji); } / *** Tambahkan informasi karyawan* / @Override public void add (staf staf) {return; } / *** Hapus informasi karyawan* / @Override Staf publik Hapus (string no) {// kembalikan null langsung ke null; } // menerima objek pengunjung public void menerima (pengunjung ivisitor) {visitor.visit (ini); }}3.4 Ivisitor Antarmuka Pengunjung
Paket com.demo.visitor; impor com.demo.struktur.employees; impor com.demo.struktur.Manager;/** * Antarmuka pengunjung * * @author * */antarmuka publik Ivisitor {// Access Manager Kunjungan public void (Manajer Manajer); // Akses Kunjungan Kerja Publik Karyawan Biasa (Karyawan Karyawan);}3.5 Pengunjung Informasi Dasar Karyawan PrintbaseInfovistor
Paket com.demo.visitor; import com.demo.struktur.employees; impor com.demo.struktur.Manager;/*** Cetak pengunjung informasi dasar** @author**/kelas publik printbaseInfovisitor mengimplementasikan ivisitor {/*** Access Manager Object*/Public Void (Manajer Manajer) {("Manajer Access." manajer.printuserbaseInfo (); } / *** Akses objek karyawan biasa* / kunjungan public void (karyawan karyawan) {System.out.print ("- Karyawan Umum:"); karyawan.printuserbaseInfo (); }}3.6 Buat Antarmuka Pengunjung untuk Menyatakan Gaji Karyawan - Isalaryvistor
Paket com.demo.visitor;/** * Hitung pengunjung gaji * * @author * */antarmuka publik ISAlaryVisitor memperluas ivisitor {// manajer statistik gaji publik void printmanagertaliSalary (); // statistik gaji karyawan umum void printempreadeestotalary (); // statistik semua karyawan gaji public void printtotalary ();}3.7 Statistik Gaji Karyawan dan Pengunjung untuk mewujudkan penyelamat gaji
Paket com.demo.visitor; impor com.demo.struktur.employees; impor com.demo.struktur.Manager;/** * Implementasi spesifik dari penghitungan pengunjung gaji * * @Author * */gaji kelas publik mengimplementasikan isalaryvisitor {// total manajer float manajer privat float managersalary; // gaji total karyawan biasa float floatsalary; Public ValaryVisitor () {ManagerSalary = 0; kerja kerja = 0; } // Access Manager Void Void Visit (Manajer Manager) {ManagerSalary += Manager.GetSalary (); } // Kunjungi Karyawan Biasa Kunjungan Publik Kunjungan Publik (Karyawan Karyawan) {Employeessalary += karyawan.getSalary (); } // Statistik Gaji karyawan umum void public printemployeestotalary () {System.out.println ("Jumlah Gaji Karyawan Umum:" + karyawan); } // Statistik Gaji manajer void public printManAgerTalSalary () {System.out.println ("Jumlah Gaji Manajer:" + ManajerAlary); } // Statistik dari semua karyawan gaji public void printtotalary () {System.out.println ("Gaji majikan:" + (Manajeralary + karyawan)); }}3.8 Klien Menguji Klien
Paket com.demo; impor com.demo.struktur.employees; impor com.demo.struktur.Manager; import com.demo.struktur.staff; import com.demo.visitor.printbaseInfovisitor @main ** * * farparhan * * publicor * * publichor * publichor * publichor * publichor * publichor * publichor * publichor * {{{/{/** * */ public static void main (String [] args) {// CEO Staff CEO Boss = Manajer Baru ("1", "Big Boss", "CEO", 100000); / *** CEO memiliki beberapa manajer departemen*/ // Staf Manajer Departemen Keuangan FinanceManager = Manajer Baru ("11", "Presiden Zhang", "Manajer Keuangan", 60000); // Manajer Departemen Sumber Daya Manusia PersonilelManager = Manajer Baru ("12", "Presiden Wang", "Presiden Manajer", 60000); // Manajer Departemen Teknis Staf Teknis Manajer = Manajer Baru ("13", "Presiden Chen", "Manajer Departemen Teknis", 60000); / *** Ada juga asisten dan beberapa pengawas di departemen teknis*/ // Departemen Teknis Asisten Staf Deptassistant = Manajer Baru ("1301", "Asisten Wang", "Asisten Departemen", 20000); // Direktur Departemen Teknis1 Deptmanager Staff1 = Manajer Baru ("1302", "Supervisor1", "Direktur Teknis", 30000); / ** * Direktur Teknis DeptManager1 Ada insinyur perangkat lunak (orang yang akhirnya bekerja) */ staf SoftwareEngineer1 = Karyawan Baru ("1302001", "Zhang San", "Insinyur Perangkat Lunak", 5000); Staff perangkat lunakEngineer2 = karyawan baru ("1302002", "Li Si", "Software Engineer", 5500); Staff SoftwareEngineer3 = karyawan baru ("1302003", "Wang Wu", "Software Engineer", 4500); // tambahkan informasi karyawan untuk pengawas teknis 1 deptmanager1.add (softwareEngineer1); DeptManager1.Add (SoftwareEngineer2); DeptManager1.Add (SoftwareEngineer3); // Direktur Departemen Teknis 2 DeptManager2 = Manajer Baru ("1303", "Supervisor2", "Direktur Teknis", 30000); // Tambah: Asisten Departemen, Direktur Teknis 1 dan Direktur Teknis 2 TechnicalManager.Add (Deptassistant); TechnicalManager.Add (DeptManager1); TechnicalManager.Add (DeptManager2); // Manajer Pemasaran Staf MarketingManager = Manajer Baru ("14", "Mr. Wu", "Manajer Pasar", 60000); // Tambahkan ke CEO: Manajer Departemen Keuangan, Manajer Departemen Sumber Daya Manusia, Manajer Departemen Teknis dan Manajer Pemasaran Boss.Add (Financeemanager); boss.add (personelManager); boss.add (TechnicalManager); Boss.Add (MarketingManager); // cetak informasi CEO // boss.printuserbaseInfo (); // cetak bos informasi karyawan CEO. / *** Statistik Gaji karyawan*/ // Buat statistik gaji karyawan pengunjung pengunjung pengunjung = gaji baru (); // Biarkan bos besar menerima bos pengunjung. // Pengunjung Statistik Gaji. // statistik gaji karyawan umum pengunjung.printemployeestotelary (); // semua pengunjung statistik gaji karyawan.printtotalary (); }}4 hasil berjalan
- Manajer: - | 1 CEO BOS BIG 100000.0
- Manajer: - | 11 General Zhang Finance Department Manager 60000.0
- Manajer: - | 12 Manajer Departemen Sumber Daya Manusia General Wang 60000.0
- Manajer: - | 13 General Chen Technical Department Manager 60000.0
- Manajer: - | 1301 Asisten Departemen Wang Asisten 20000.0
- Manajer: - | 1302 Supervisor 1 Pengawas Teknis 30000.0
- Karyawan Umum: - | 1302001 Zhang San Software Engineer 5000.0
- Karyawan Umum: - | 1302002 Li Si Software Engineer 5500.0
- Karyawan Umum: - | 1302003 Wang Wu Software Engineer 4500.0
- Manajer: - | 1303 Supervisor 2 Pengawas Teknis 30000.0
- Manajer: - | 14 Manajer Umum Departemen Pemasaran WU 60000.0
Gaji Total Manajer: 420.000.0
Total Gaji Karyawan Umum: 15000.0
Total Gaji Karyawan: 435.000.0
AKU AKU AKU. Prinsip -prinsip desain dari pola ini
1 prinsip "dekat-dekat"
2 prinsip tanggung jawab tunggal
4. Gunakan kesempatan
1 Jika Anda memasukkan berbagai jenis objek dalam struktur objek, mereka memiliki antarmuka yang berbeda, dan Anda ingin menerapkan beberapa operasi yang bergantung pada kelas spesifik pada objek yang berbeda ini.
2 Anda perlu melakukan banyak operasi yang berbeda dan tidak terkait pada objek dalam struktur objek, dan Anda ingin menghindari menghubungkan operasi ini dengan kelas objek ini. Mode pengunjung memungkinkan operasi terkait terpusat dan didefinisikan secara terpisah di kelas.
3 Ketika struktur objek ini dibagikan oleh banyak aplikasi, gunakan mode pengunjung untuk memungkinkan setiap aplikasi hanya berisi operasi yang perlu digunakan.
4 Kelas yang mendefinisikan struktur objek jarang berubah, tetapi operasi baru sering diperlukan untuk mendefinisikan dalam struktur ini.
5. Diagram Kelas Statis Mode Pengunjung
Untuk konten yang lebih terkait dengan Java, pembaca yang tertarik dengan situs ini dapat melihat topik: "Tutorial Struktur Data Java dan Algoritma", "Ringkasan Java Operation Dom Node Tips", "Ringkasan Tips Operasi Java File dan Direktori" dan "Ringkasan Java Cache Tips"
Saya harap artikel ini akan membantu pemrograman Java semua orang.