谷歌面试题:继承关系变组合关系
2023-09-11 14:16:50 时间
题目描述
一个项目中有Employee类型,该类型是个大类型,下分为Engineer类型和Manager类型。比方一个人开始是Engineer类型,后来升职了,变成了Manager的角色,这种情况,应该如何建模更好一些。
思路
变继承关系为组成关系,方便扩展。
代码
定义一个Role的接口:
public interface Role { void doWork(); }
定义Employee类型:
public class Employee { private final String name; private final int salary; private Role role; public Employee(String name, int salary, Role role) { this.name = name; this.salary = salary; this.role = role; } public String getName() { return name; } public int getSalary() { return salary; } public Role getRole() { return role; } public void setRole(Role role) { this.role = role; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", salary=" + salary + ", role=" + role + '}'; } public void doWork(){ this.role.doWork(); } }
定义Engineer类型:
public class Engineer implements Role { @Override public void doWork() { System.out.println("Doing Engineer work."); } @Override public String toString() { return "Engineer"; } }
定义Manager类型:
import java.util.ArrayList; import java.util.List; public class Manager implements Role { private List<Employee> reporters; public Manager(List<Employee> reporters) { this.reporters = new ArrayList<>(reporters); } @Override public void doWork() { System.out.println("Dispatching work."); Employee employee = selectReporter(); employee.doWork(); } private Employee selectReporter() { return reporters.get(0); } @Override public String toString() { return "Manager"; } }
最后进行测试,将“陈驰”的角色由Engineer变成Manager :
import java.util.Arrays; public class Test { public static void main(String[] args) { Employee employee1 = new Employee("陈驰", 20000, new Engineer()); Employee employee2 = new Employee("魏印福", 20000, new Engineer()); System.out.println(employee1); System.out.println(employee2); System.out.println("Employee1:"); employee1.doWork(); System.out.println("Employee2:"); employee2.doWork(); System.out.println("职位升迁......"); employee1.setRole(new Manager(Arrays.asList(employee2))); System.out.println(employee1); System.out.println(employee2); System.out.println("Employee1:"); employee1.doWork(); System.out.println("Employee2:"); employee2.doWork(); } }
查看测试结果:
相关文章
- 测试面试 | 头铁硬肝自动化测试,跳槽薪资翻 3 倍(附面试题)
- 测试面试 | Python 算法与数据结构面试题系列二(附答案)
- 终于拿下25K的offer,自动化测试面试题+回答,面试官都听懵了......
- 2023史上最全软件测试工程师常见的面试题总结 备战金三银四
- 2023年最新软件测试面试题,看完还怕拿不到offer?
- 【测试面试题】页面很卡的原因分析及解决方案
- Java 基础高频面试题(2021年最新版)
- Java 面试题集锦,横扫金九银十。
- Java中高级面试题详解
- 面试题:怎么保证MQ的高可用
- MySQL面试题合集!
- 2023年Redis常见面试题10道
- 多线程面试题开胃菜4(5道)
- 中间件面试题
- 算法实践——Twitter算法面试题(积水问题)的线性时间解法