Challenge: Solution Review
This lesson will explain the solution to the problem from the last coding challenge.
We'll cover the following
Solution #
class HR {constructor(){this.employeeList = []}registerEmployee(employee){this.employeeList[employee.name] = employee}scheduleRaise(raise,worker, manager){manager.receiveMessage(worker,raise)var ans = manager.approveRaise(worker,raise)if(ans){worker.receiveRaise(raise)}}}class Employee{constructor(hr,name,position,pay){this.hr = hrthis.name = namethis.position = positionthis.pay = pay}}class Manager extends Employee{constructor(hr,name,position,pay){super(hr,name,position,pay)this.hr.registerEmployee(this)}receiveMessage(worker,raise){console.log(`${worker.name} should get ${raise} dollar raise`)}approveRaise(worker,raise){console.log(`${worker.name}'s ${raise} dollar raise is approved`)return true}}class Worker extends Employee{constructor(hr,name,position,pay){super(hr,name,position,pay)this.hr.registerEmployee(this)}receiveRaise(raise){this.pay += raiseconsole.log(`My new pay is ${this.pay} dollars`)}}var hr = new HR()var employee = new Worker(hr,"Joe","Developer",1400)var manager = new Manager(hr,"Allen","Team Lead",3000)hr.scheduleRaise(200,employee,manager)
Explanation
In this challenge, you had to use the mediator pattern to implement the HR of an office. HR acts as a communication channel between different employees of a company, such as a manager and the workers.
Let’s start by discussing the HR
class.
class HR {
constructor(){
this.employeeList = []
}
//code...
}
The constructor
initializes an array employeeList
that will contain all the employees in the company.
Next, it has the registerEmployee
function that registers an employee by adding them to the list of employees.
registerEmployee(employee){
this.employeeList[employee.name] = employee
}
Next, it defines the scheduleRaise
function:
scheduleRaise(raise,worker, manager){
manager.receiveMessage(worker,raise)
var ans = manager.finalizeRaise(worker,raise)
if(ans){
worker.receiveRaise(raise)
}
}
First, the manager
will receive the raise
message from the HR through the receiveMessage
function. Next, HR
will wait for the manager
to approve the raise. The approveRaise
will return true when the manager authorizes the raise. Once, the raise is approved, the worker will receive the payment through the receiveRaise
function.
Now let’s look at the Employee
class:
class Employee{
constructor(hr,name,position,pay){
this.hr = hr
this.name = name
this.position = position
this.pay = pay
}
}
An employee object has the properties: name
, position
, pay
, and the hr
that the employee communicates with.
The Manager
class extends the Employee
class.
class Manager extends Employee{
constructor(hr,name,position,pay){
super(hr,name,position,pay)
this.hr.registerEmployee(this)
}
//code...
}
The constructor
invokes super
to initialize all the properties of the Employee
class for the Manager
. Whenever a manager instance is created, it gets registered into the company by the hr
. You can see this in the following line in the constructor
:
this.hr.registerEmployee(this)
The Manager
class also defines the receiveMessage
function.
receiveMessage(worker,raise){
console.log(`${worker.name} should get ${raise} dollar raise`)
}
This function displays the message the Manager
receives from the HR
regarding the raise of the worker.
approveRaise
function is also defined in the Manager
class.
approveRaise(worker,raise){
console.log(`${worker.name}'s ${raise} dollar raise is approved`)
return true
}
This function displays the message regarding the manager approving the raise of the worker. It returns true
at the end to convey that the raise has been approved.
The Worker
class also extends the Employee
class.
class Worker extends Employee{
constructor(hr,name,position,pay){
super(hr,name,position,pay)
this.hr.registerEmployee(this)
}
//code...
}
The constructor
invokes super
to invoke all the properties of the Employee
class for the Worker
. Whenever a worker instance is created, it gets registered into the company by the hr
. You can see this in the following line in the constructor
:
this.hr.registerEmployee(this)
The Manager
class also defines the receiveRaise
function.
receiveRaise(raise){
this.pay += raise
console.log(`My new pay is ${this.pay} dollars`)
}
This function increments the pay
of the worker by the raise
. Then it displays the message announcing the new pay of the worker.
Let’s discuss the observer pattern in the next lesson.