В этой статье описывается использование режима посетителей для решения проблемы иерархической структурной диаграммы компании. Поделитесь этим для вашей ссылки, следующим образом:
1. Определение шаблона
Режим посетителя: представляет операцию, которая действует на каждом элементе в структуре объекта. Это позволяет пользователю определять новые операции, которые действуют на эти элементы, не изменяя класс каждого элемента.
2. Примеры модели
1 Анализ шаблона
Мы заимствуем иерархию компании, чтобы проиллюстрировать эту модель.
2 Статическая схема режима для посетителя
3 примеры кода
3.1 Аннотация персонал
пакет com.demo.structure; import com.demo.visitor.ivisitor;/** * Аннотация класс работников * * @author * */public Abstract Class staff {// Номер сотрудника защищенная строка no; // Имя сотрудника Защищенное имя строки; // позиция защищенная строковая позиция; // Зарплата защищенная зарплата поплавкой; // Строка личной недвижимости Private Int Length; // Создание метода общественного персонала (строка №, имя строки, позиция строки, зарплата плавания) {this.no = no; this.name = name; this.position = position; это .salary = зарплата; // Рассчитайте общую длину байта this.length += (no == null || "" .equals (№ trim ()))? 0: № GetBytes (). Длина; this.length += (name == null || "" .equals (name.trim ()))? 0: position.getBytes (). Length; this.length += (position == null || "" .equals (position.trim ()))? 0: position.getBytes (). Length; this.length += string.valueof (зарплата) .getbytes (). Length; } // Получить базовую информацию пользователя public void printuserbaseinfo () {System.out.println ("-|" + this.no + "" + this.name + "" + this.position + "" + this.salary); } // Добавить информацию о сотруднике Public Abstract void Add (Персонал); // Удалить сотрудник Общественного абстрактного абстрактного сотрудника (String no); // получение объекта посетителя Общественное абстрактное void принять (посетитель IVISITOR); public String getNo () {return no; } public void setno (string no) {this.no = no; } public String getName () {return name; } public void setName (string name) {this.name = name; } public String getPosition () {return Position; } public void setPosition (строковая позиция) {this.position = position; } public float getSalary () {return Parlary; } public void setSalary (платная зарплата) {this.salary = зарплата; }}3.2 Менеджер
пакет com.demo.structure; import java.util.arraylist; import com.demo.visitor.ivisitor;/** * Менеджер (кто -то с другими сотрудниками под их командованием) * * @author * */public Class Manager extends {// Магазин информации о сотрудниках частного окончательного Arraylist <ship> ArrayList = new Arraylist <) (); // Создание метода Public Manager (строка №, имя строки, позиция строки, зарплата плавания) {super (no, имя, позиция, зарплата); } / *** Добавить сотрудника* / @Override public void add (персонал) {this.ArrayList.add (персонал); } / *** Удалить информацию о сотруднике* / @Override Общественный персонал удалить (строка no) {персонал = null; if (no! = null &&! ". } if (№ equals (this.arraylist.get (i) .getno ())) {heft = this.arraylist.remove (i); перерыв; }}} возвращать персонал; } // Получить объект посетителя @Override public void Accept (посетитель IVISITOR) {// Доступ к своему собственному посетителю.visit (this); // Переносить различные объекты элементов в списке списка и получить объект для посетителя для (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {продолжить; } // Принять объект посетителя this.arraylist.get (i) .accept (посетитель); }}}3.3 обычные сотрудники
пакет com.demo.structure; import com.demo.visitor.ivisitor;/** * Обычные сотрудники (реальные люди работают) * * @author * */public Class Сотрудники расширяют персонал {// построить метод общественных сотрудников (строка no, название строки, позиция строки, плавающая зарплата) {Super (NO, имя, позиция, заработная плата); } / *** Добавить информацию о сотруднике* / @Override public void add (персонал) {return; } / *** Удалить информацию о сотруднике* / @Override Public Maff Remove (String no) {// возвращать NULL непосредственно в NULL; } // Получить объект посетителя public void Accept (Ivisitor Visitor) {vititor.visit (this); }}3.4 Интерфейс-интерфейс посетителей
пакет com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager;/** * Интерфейс посетителя * * @author * */public invisitor {// access Manager public void Viate (Manager Manager); // Доступ к обычным сотрудникам Public Void Visit (сотрудники сотрудников);}3.5 Основная информация сотрудников Посетители PrintBaseInfovistor
пакет com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager;/*** Печать базовой информации для посетителя** @author**/public class printbaseinfovisitor реализует ivisitor {/*** Access Manager*/public void Visit (Manager Manager) {System.out.print ("-менеджер:") Manager.printuserbaseinfo (); } / *** Доступ к обычным объектам сотрудника* / public void визит (сотрудники сотрудников) {System.out.print ("- Общий сотрудник:"); сотрудники.printuserbaseinfo (); }}3.6 Создайте интерфейс посетителя для заявления зарплаты сотрудников - Isalaryvistor
пакет com.demo.visitor;/** * Рассчитайте посетителя заработной платы * * @author * */public interface isalaryvisitor расширяет ivisitor {// менеджер по статистике. // Статистика Общая зарплата работника Public void PrinteStototalsalary (); // Статистика Все сотрудники зарплаты public void printtolalsalary ();}3.7 Статистика зарплаты и посетителей сотрудников, чтобы реализовать зарплату.
пакет com.demo.visitor; import com.demo.structure.employee; import com.demo.structure.manager;/** * Специальная реализация расчетного посетителя зарплаты * * @author * *//public Class Salarvisitor реализует Isalaryvisitor {// Общая заработная плата Private Prot Float Managersalary; // Общая зарплата обычных работников Частный поплавок public SalararyVisitor () {Managersalary = 0; employeSessalary = 0; } // Access Manager public void View (Manager Manager) {Managersalary += Manager.getSalary (); } // Посетите обычные сотрудники Public void Visit (сотрудники сотрудников) {employseSsalary += employms.getSalary (); } // Статистика Заработная плата общих сотрудников public void printeMployEestolalsalary () {System.out.println ("Общая сумма заработной платы работника:" + работник); } // Статистика Зарплата менеджеров public void printmanagertalsalary () {System.out.println ("Управляющая сумма заработной платы:" + Managersalary); } // Статистика заработной платы всех сотрудников Public void printtotalsalary () {System.out.println ("Зарплата работодателя:" + (Managersalary + Employeessalary)); }}3.8 Клиент тестирует клиента
пакет com.demo; import com.demo.structure.employees; import com.demo.structure.manager; import com.demo.structure.staff; импорт com.demo.visitor.printbaseinfovisitor; import com.demo.visitor.salaryvisitor;/** ** ** ** ** ** ** ** ** ** */ public static void main (string [] args) {// генеральный директор компании Boss = новый менеджер («1», «Большой босс», «генеральный директор», 100000); / *** У генерального директора есть несколько руководителей департаментов*/ // Менеджер по финансам финансового департамента FinanceManager = новый менеджер («11», «Президент Чжан», «Финансовый менеджер», 60000); // Менеджер отдела кадров сотрудников сотрудников Mannelmanager = новый менеджер («12», «Президент Ван», «Президент менеджер», 60000); // Менеджер технического департамента персонал Technical Manager = новый менеджер («13», «Президент Чен», «Менеджер технического департамента», 60000); / *** Есть также помощники и несколько руководителей в техническом отделе*/ // Помощник технического отдела Deptassistant = новый менеджер («1301», «Помощник Ван», «Помощник департамента», 20000); // Технический департамент директор1 Deptmanager1 = новый менеджер («1302», «Supervisor1», «Технический директор», 30000); / ** * Технический директор DEPTMANAGER1 Существуют инженеры -программисты (человек, который заканчивает тем, что работает) */ SHEFF SoftwareNegneer1 = новые сотрудники («1302001», «Zhang San», «Инженер -программист», 5000); Персонал SoftwareNegneer2 = новые сотрудники («1302002», «Li Si», «Инженер -программист», 5500); Staff SoftwareNegneer3 = новые сотрудники («1302003», «Ван Ву», «Инженер -программист», 4500); // Добавить информацию о сотруднике для технического руководителя 1 deptmanager1.add (SoftwareNigner1); deptmanager1.add (SoftwareNigner2); deptmanager1.add (SoftwareNigner3); // Директор технического департамента 2 сотрудников DEPTMANAGER2 = новый менеджер («1303», «Supervisor2», «Технический директор», 30000); // Добавить: Помощник департамента, технический директор 1 и технический директор 2 Technical Manager.add (Deptassistant); Technical Manager.add (deptmanager1); Technical Manager.add (deptmanager2); // Менеджер по маркетингу персонал MarketingManager = новый менеджер («14», «г -н Ву», «Менеджер рынка», 60000); // Добавить к генеральному директору: менеджер финансового отдела, менеджер отдела кадров, менеджер по техническому департаменту и менеджер по маркетингу Boss.Add (FinanceManager); Boss.Add (Personnelmanager); Boss.Add (Technical Manager); Boss.Add (MarketingManager); // Печать информации генерального директора // boss.printuserbaseinfo (); // Распечатать информацию о сотруднике генерального директора Boss.Accep (New PrintBaseInfovisitor ()); / *** Статистическая зарплата работника*/ // Создание статистического обслуживания работников зарплаты посетителя посетителя = новый зарплата (); // Пусть Большой Босс примет посетителя Boss.accept (посетитель); // Управляющий статистика заработной платы. // Общий статистика заработной платы работников. // Все статистика заработной платы сотрудников. }}4 Результаты работы
- Менеджер: - | 1 генеральный директор Big Boss 100000.0
- Менеджер: - | 11 Генеральный менеджер финансового отделения Чжанга 60000.0
- Менеджер: - | 12 Генеральный менеджер отдела кадров Ванг 60000.0
- Менеджер: - | 13 Генеральный менеджер технического отдела Чена 60000.0
- Менеджер: - | 1301 Помощник Помощника департамента Ванга 20000.0
- Менеджер: - | 1302 Supervisor 1 Технический руководитель 30000.0
- Генеральные сотрудники: - | 1302001 Zhang San Shireaderener 5000.0
- Генеральные сотрудники: - | 1302002 Li Si -инженер программного обеспечения 5500.0
- Генеральные сотрудники: - | 1302003 Wang Wu Skriender Ingenerier 4500.0
- Менеджер: - | 1303 Supervisor 2 Технический руководитель 30000.0
- Менеджер: - | 14 Генеральный менеджер WU Marketing Department 60000.0
Общая зарплата менеджера: 420 000,0
Общая зарплата общих сотрудников: 15000,0
Общая зарплата сотрудников: 435 000,0
Iii. Принципы дизайна этого образца
1 Принцип «открытый»
2 Принцип единой ответственности
4. Используйте случаи
1 Если вы включаете много разных типов объектов в структуру объекта, они имеют разные интерфейсы, и вы хотите реализовать некоторые операции, которые зависят от конкретных классов на этих разных объектах.
2 Вам необходимо выполнить много разных и не связанных с ними операций на объектах в структуре объекта, и вы хотите избежать связывания этих операций с классами этих объектов. Режим для посетителей позволяет централизовать и определять связанные операции отдельно в классе.
3 Когда эта структура объекта используется многими приложениями, используйте режим посетителя, чтобы каждое приложение содержало только те операции, которые необходимо использовать.
4 Классы, которые определяют структуру объекта, редко меняются, но для определения этой структуры часто требуются новые операции.
5. Статическая классовая диаграмма режима посетителя
Для получения дополнительного контента, связанного с Java, читатели, заинтересованные в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Operation Dom Узел», «Краткое изложение Java File и Directory Commine» и «Советы по эксплуатации Java Cache»
Я надеюсь, что эта статья будет полезна для всех Java Programming.