Skip to content

Instantly share code, notes, and snippets.

@fermopili
Created May 21, 2017 09:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fermopili/0695858651e202aab8c6460019fdf9a2 to your computer and use it in GitHub Desktop.
Save fermopili/0695858651e202aab8c6460019fdf9a2 to your computer and use it in GitHub Desktop.
com.javarush.task.task37.task3713.space Chain of Responsibility
package com.javarush.task.task37.task3713;
import com.javarush.task.task37.task3713.space.crew.AbstractCrewMember;
import com.javarush.task.task37.task3713.space.SpaceShip;
/*
Chain of Responsibility
*/
public class Solution {
public static void main(String[] args) {
SpaceShip spaceShip = new SpaceShip();
AbstractCrewMember crewMember = spaceShip.getCrewChain();
crewMember.handleRequest(AbstractCrewMember.CompetencyLevel.EXPERT, "ATTACK");
System.out.println("-----------------------------------------");
crewMember.handleRequest(AbstractCrewMember.CompetencyLevel.NOVICE, "WASH THE FLOOR");
System.out.println("-----------------------------------------");
crewMember.handleRequest(AbstractCrewMember.CompetencyLevel.INTERMEDIATE, "CHECK ENGINE");
System.out.println("-----------------------------------------");
crewMember.handleRequest(AbstractCrewMember.CompetencyLevel.ADVANCED, "SET ROUTE");
}
}
package com.javarush.task.task37.task3713.space.crew;
public abstract class AbstractCrewMember
{
public enum CompetencyLevel
{
NOVICE,
INTERMEDIATE,
ADVANCED,
EXPERT
}
protected CompetencyLevel competencyLevel;
protected AbstractCrewMember nextCrewMember;
public void setNextCrewMember(AbstractCrewMember nextCrewMember)
{
this.nextCrewMember = nextCrewMember;
}
public void handleRequest(CompetencyLevel competencyLevel, String request)
{
// if (nextCrewMember.competencyLevel == CompetencyLevel.EXPERT)
// {
// doTheJob ( request );
// return;
// }
// else if (nextCrewMember != null)
if (this.competencyLevel == competencyLevel)
{
doTheJob ( request );
}
else if (this.competencyLevel.ordinal ( ) < competencyLevel.ordinal ( ))
{
nextCrewMember.handleRequest ( competencyLevel, request );
}
}
protected abstract void doTheJob(String request);
}
package com.javarush.task.task37.task3713.space.crew;
public class CabinBoy extends AbstractCrewMember
{
public CabinBoy(AbstractCrewMember.CompetencyLevel competencyLevel)
{
this.competencyLevel = competencyLevel;
}
protected void doTheJob(String request)
{
System.out.println ( "Even the cabin boy can handle the request " + request );
}
}
package com.javarush.task.task37.task3713.space.crew;
public class Captain extends AbstractCrewMember {
public Captain (AbstractCrewMember.CompetencyLevel competencyLevel) {
this.competencyLevel = competencyLevel;
}
protected void doTheJob(String request) {
System.out.println("Only the captain can handle request " + request + ". Let's do this!");
}
}
package com.javarush.task.task37.task3713.space.crew;
public class Engineer extends AbstractCrewMember {
public Engineer (AbstractCrewMember.CompetencyLevel competencyLevel) {
this.competencyLevel = competencyLevel;
}
protected void doTheJob(String request) {
System.out.println(request + " is a common engineering task. To the work!");
}
}
package com.javarush.task.task37.task3713.space.crew;
public class FirstMate extends AbstractCrewMember {
public FirstMate (AbstractCrewMember.CompetencyLevel competencyLevel) {
this.competencyLevel = competencyLevel;
}
protected void doTheJob(String request) {
System.out.println("The request " + request + " will be handled by first mate, let's not bother the captain with it.");
}
}
package com.javarush.task.task37.task3713.space;
import com.javarush.task.task37.task3713.space.crew.*;
public class SpaceShip
{
public AbstractCrewMember getCrewChain()
{
AbstractCrewMember cabinBoy = new CabinBoy ( AbstractCrewMember.CompetencyLevel.NOVICE );
AbstractCrewMember engineer = new Engineer ( AbstractCrewMember.CompetencyLevel.INTERMEDIATE );
AbstractCrewMember firstMate = new FirstMate ( AbstractCrewMember.CompetencyLevel.ADVANCED );
AbstractCrewMember captain = new Captain ( AbstractCrewMember.CompetencyLevel.EXPERT );
cabinBoy.setNextCrewMember ( engineer );
engineer.setNextCrewMember ( firstMate );
firstMate.setNextCrewMember ( captain );
return cabinBoy;
}
}
taskKey="com.javarush.task.task37.task3713"
Chain of Responsibility
Амиго, у нас проблема! Во время визита на планету #IND893 мы рискнули отдать на аутсорсинг автоматизацию
входящих задач для членов команды. В это сложно поверить, но похоже всю работу теперь должен выполнять
первый помощник!
Необходимо срочно исправить поведение программы, ведь полы может помыть и юнга, а приказ "к бою!" может дать
только капитан.
P.S. Постарайся реализовать метод handleRequest таким образом, чтобы при добавлении новых должностей нам
не требовалось вносить в него изменения. Другие методы не трогай.
P.P.S. Все enum поддерживают интерфейс Comparable.
Требования:
1. Запрос должен быть обработан текущим членом команды, если это возможно.
2. Запрос должен быть передан по цепочке выше, если текущий член команды не может его обработать.
3. Классы CabinBoy, Engineer, FirstMate и Captain должны быть потомками класса AbstractCrewMember.
4. Класс AbstractCrewMember должен быть абстрактным.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment