• JAVA_객체지향 프로그래밍, 인터페이스 사용 예제 전화 상담 시스템

    2021. 8. 5.

    by. KAEY


      - 해당 코드를 참조만 하시고, 복사 붙여넣기를 통한 과제를 진행하시면 도움이 정말 하나도 안됩니다. 부디 직접해보시고, 다른 사람의 솔루션이 어떤 지 참조하시는 정도로만 사용해주세요.


    시나리오

    고객센터에는 전화 상담원들이 있습니다. 고객센터로 전화가 오면 대기열에 저장됩니다.

    상담원이 지정되기 전까지 대기상태가 됩니다.

    각 전화를 상담원에게 배분하는 정책은 다음과 같이 구현할 수 있습니다.

     

    1. 순서대로 배분하기 : 모든 상담원이 동일하 상담건수를 처리하도록 들어오는 전화 순서대로 상담원에게 하나씩 배분합니다.

    2. 짧은 대기열 찾아 배분하기 : 고객 대기 시간을 줄이기 위해 상담을 하지 않는 상담원이나 가장 짧은 대기열을 보유한 상담원에게 배분합니다.

    3. 우선 순위에 따라 배분하기 : 고객 등급에 따라 등급이 높은 고객의 전화를 우선 가져와서 업무 능력이 좋은 상담원에게 우선 배분 합니다.

     


    SchedulerTest.java

    package java0805;
    import java.io.IOException;
    
    public class SchedulerTest {
    	public static void main(String[] args) throws IOException {
    		System.out.println("전화 상담 할당 방식을 선택 하세요.");
    		System.out.println("R : 한명씩 차례로 할당 ");
    		System.out.println("L : 쉬고 있거나 대기가 가장 적은 상담원에게 할당 ");
    		System.out.println("P : 우선순위가 높은 고객 먼저 할당 ");
    		
    		int ch = System.in.read();
    		Scheduler scheduler = null;
    		
    		if(ch == 'R' || ch == 'r') {
    			scheduler = new RoundRobin();
    		} else if(ch == 'L' || ch == 'l') {
    			scheduler = new LeastJob();
    		} else if(ch == 'P'|| ch == 'p') {
    			scheduler = new PriorityAllocation();
    		} else {
    			System.out.println("지원되지 않는 기능입니다.");
    			return;
    		}
    		scheduler.getNextCall();
    		scheduler.sendCallToAgent();
    		}
    }

    Scheduler.Java

    package java0805;
    
    public interface Scheduler {
    	public void getNextCall();
    	public void sendCallToAgent();
    }

    RoundRobin.java

    package java0805;
    
    public class RoundRobin implements Scheduler{
    		
    	public void getNextCall() {
    		System.out.println("상담 전화를 순서대로 대기열에서 가져옵니다");
    	}
    	public void sendCallToAgent() {
    		System.out.println("다음 순서 상담원에게 배분합니다.");
    	}
    }

    PriorityAllocation.java

    package java0805;
    
    public class PriorityAllocation implements Scheduler {
    
    	public void getNextCall() {
    		System.out.println("상담 전화를 순서대로 대기열에서 가져옵니다");
    	}
    	public void sendCallToAgent() {
    		System.out.println("높은 등급의 고객의 전화를 업무 능력이 좋은 상담원에게 연결합니다.");
    	}
    	
    }

    LeastJob.java

    package java0805;
    
    public class LeastJob implements Scheduler{
    	public void getNextCall() {
    		System.out.println("상담 전화를 순서대로 대기열에서 가져옵니다");
    	}
    	public void sendCallToAgent() {
    		System.out.println("현재 상담업무가 없거나 상담대기가 가장작은 상담원에게 할당합니다.");
    	}
    }

    추가 시나리오

    상담 정책을 추가해 봅니다.

    상담 전화를 할당하는 방식이 아닌 상담원이 본인이 필요할 때 가져오는 AgentGetCall 클래스를 추가로 만듭니다.

    추가된 정책에서 getNextCall()이 호출되면 ‘상담원이 다음 전화 요청’이라고 출력합니다.

    sendCallToAgent() 가 호출되면 ‘상담원이 전화 상담을 가져갔습니다’라고 출력합니다.

    추가된 정책은 SchedulerTest가 실행될 때 A 또는 a 를 입력하면 선택됩니다.

    AgentGetCall 클래스가 Scheduler 인터페이스를 구현하고,

    이를 SchedulerTest에서 생성하여 테스트해보세요.


    SchedulerTest.java

    package java0805;
    import java.io.IOException;
    
    public class SchedulerTest {
    	public static void main(String[] args) throws IOException {
    		System.out.println("전화 상담 할당 방식을 선택 하세요.");
    		System.out.println("R : 한명씩 차례로 할당 ");
    		System.out.println("L : 쉬고 있거나 대기가 가장 적은 상담원에게 할당 ");
    		System.out.println("P : 우선순위가 높은 고객 먼저 할당 ");
    		System.out.println("A : 전화 상담을 원하는 상담원에게 할당 ");
    		System.out.println("****************************** ");
    		int ch = System.in.read();
    		Scheduler scheduler = null;
    		
    		if(ch == 'R' || ch == 'r') {
    			scheduler = new RoundRobin();
    		} else if(ch == 'L' || ch == 'l') {
    			scheduler = new LeastJob();
    		} else if(ch == 'P'|| ch == 'p') {
    			scheduler = new PriorityAllocation();
    		} else if(ch == 'A' || ch == 'a'){
    			scheduler = new AgentGetCall();
    		} else {
    			System.out.println("지원되지 않는 기능입니다.");
    			return;
    		}
    		scheduler.getNextCall();
    		scheduler.sendCallToAgent();
    		}
    }

    AgentGetCall.java

    package java0805;
    
    public class AgentGetCall implements Scheduler{
    	public void getNextCall() {
    		System.out.println("상담원이 다음 전화를 요청합니다.");
    	}
    	public void sendCallToAgent() {
    		System.out.println("상담원이 전화 상담을 가져갔습니다.");
    	}
    }

    출력 결과


     


    댓글 (비로그인 댓글 허용하지 않습니다.)