티켓 판매 어플리케이션

"티켓 판매 어플리케이션" 으로 객체 지향 설계를 익혀봅니다.

티켓을 통해 관람객이 공연을 관람할 수 있도록 서비스 해야합니다.

이벤트를 통해 추첨을 받은 관람객은 초대장을 티켓으로 무료로 바꿀 수 있습니다.

그렇지 않은 관람객은 티켓을 구매하여 공연을 관람할 수 있습니다.

어떤 객체들이 필요하고, 어떻게 협력해야 할까요?

공연 관람에 추첨을 받은 관람객은 초대장이 있습니다.

초대장은 공연의 초대일자가 포함됩니다.

public class Invitation {
    private LocalDateTime when;
}

초대장을 받은 관람객은 초대장을 티켓으로 교환할 수 있습니다.

초대장이 없는 일반 관람객은 티켓을 현금으로 구매할 수 있습니다.

public class Ticket {
    private Long fee;
    
    public Long getFee() {
        return fee;
    }
}

관람객은 (1) 초대를 받았거나 (2) 초대를 받지않은 관람객으로 나뉩니다.

초대를 받은 관람객은 초대장이 있고, 현금을 있을수도 없을수도 있습니다.

초대를 받지않은 관람객은 초대장은 없지만, 현금은 꼭 있어야합니다.

소지품을 보관할 수 있는 객체, 가방을 만들어 보겠습니다.

public class Bag {
    private Ticket ticket;
    private Invitation invitation;
    private Long amount;
    
    // 초대받지 않은 관람객
    public Bag(long amount) {
        this(null, amount);
    }

    // 초대받은 관람객
    public Bag(Invitation invitation, long amount) {
        this.invitation = invitation;
        this.amount = amount;
    }

    public boolean hasInvitation() {
        return invitation != null;
    }
    
    public boolean hasTicket() {
        return ticket != null;
    }
    
    public void plusAmount(Long amount) {
        this.amount += amount;
    }

    public void minusAmount(Long amount) {
        this.amount -= amount;
    }

    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }
}

관람객 객체는 가방을 소지하고 있습니다.

public class Audience {
    private Bag bag;
    
    public Audience(Bag bag) {
	this.bag = bag;
    }
	
    public Bag getBag() {
        return bag;
    }
}

관람객은 티켓을 구매할 수 있는 매표소가 필요합니다. 그리고 매표소에는 매표소 직원이 있습니다.

public class TicketOffice {
    private List<Ticket> tickets = new ArrayList<>();
    private Long amount;

    public TicketOffice(Long amount, Ticket ... tickets) {
        this.amount = amount;
        this.tickets.addAll(Arrays.asList(tickets));
    }

    public void plusAmount(Long amount) {
        this.amount += amount;
    }

    public void minusAmount(Long amount) {
        this.amount -= amount;
    }

    public Ticket getTicket() {
        return tickets.remove(0);
    }
}

public class TicketSeller {
    private TicketOffice ticketOffice;

    public TicketSeller(TicketOffice ticketOffice) {
        this.ticketOffice = ticketOffice;
    }

    public TicketOffice getTicketOffice() {
        return ticketOffice;
    }
}

관람객은 티켓을 구했으면, 공연을 관람하도록 해야합니다.

마지막으로 극장 클래스를 구현합니다.

public class Theater {
    private TicketSeller ticketSeller;

    public Theater(TicketSeller ticketSeller) {
        this.ticketSeller = ticketSeller;
    }

    public void enter(Audience audience) {
        if (audience.getBag().hasInvitation()) {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket();
            
            audience.getBag().setTicket(ticket);
        } else {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket();
            
            audience.getBag().minusAmount(ticket.getFee());
            ticketSeller.getTicketOffice().plusAmount(ticket.getFee());
            
            audience.getBag().setTicket(ticket);
        }
    }
}

극장 클래스는 관람객을 입장시킵니다.

관람객의 가방에서 초대장이 있는지를 확인하고, 매표소 직원을 통해 매표소에서 티켓을 가져옵니다.

초대장이 없다면, 매표소 직원을 통해 매표소에서 티켓을 가져오고, 관람객의 가방에서 현금을 꺼내 매표소에 현금을 납입합니다. 그리고 관람객에게 티켓을 건넵니다.

주어진 클래스들은 잘 동작하지만, 몇가지 문제가 있습니다.

Last updated