1. 병원 입원 시나리오
1-1. main
public class Main {
public static void main(String[] args) {
Patient patient = new Patient("홍길동", 35, "복통");
Staff doctor = new Doctor();
DiagnosisProcess diagnosis = new GeneralDiagnosis();
PaymentStrategy payment = new CreditcardPayment();
Notifiable notifier = new SmsNotifier();
HospitalSystem hospital = new HospitalSystem(doctor, diagnosis, payment, notifier);
hospital.processVisit(patient);
}
}
1-2. HospitalSystem (파사드구조)
public class HospitalSystem {
private Staff staff;
private DiagnosisProcess diagnosisProcess;
private PaymentStrategy paymentStrategy;
private Notifiable notifiable;
public HospitalSystem(Staff staff, DiagnosisProcess diagnosisProcess, PaymentStrategy paymentStrategy,
Notifiable notifiable) {
this.staff = staff;
this.diagnosisProcess = diagnosisProcess;
this.paymentStrategy = paymentStrategy;
this.notifiable = notifiable;
}
public void processVisit(Patient patient){
patient.showInfo();
staff.performduty(patient);
diagnosisProcess.runprocess(patient);
paymentStrategy.pay(15000);
staff.writeRecord(patient);
notifiable.notify();
}
}
1-3. Staff
public interface Staff {
void performduty(Patient patient);
void writeRecord(Patient patient);
}
public class Doctor implements Staff {
@Override
public void performduty(Patient patient){
System.out.printf("[의사] %s님의 진료를 시작합니다. 증상 %s\n", patient.getName(), patient.getSymptom());
}
@Override
public void writeRecord(Patient patient){
HospitalDatabase.getInstance().generateReport(patient);
}
}
1-4. diagnosisProcess (템플릿 구조)
public abstract class DiagnosisProcess {
public final void runprocess(Patient patient){
System.out.println("[진료시작]"+ getType() + "진료 프로세스를 시작합니다.");
checkVitals(patient);
interview(patient);
prescribe(patient);
}
protected void checkVitals(Patient Patient){
System.out.println("바이탈 체크 완료");
}
protected abstract void interview(Patient Patient);
protected abstract void prescribe(Patient Patient);
protected abstract String getType();
}
public class GeneralDiagnosis extends DiagnosisProcess {
@Override
protected String getType() {
return "일반";
}
@Override
protected void interview(Patient Patient) {
System.out.println("일반 문진 중...");
}
@Override
protected void prescribe(Patient Patient) {
System.out.println("일반 처방이 완료되었습니다.");
}
}
1-5. patient
public class Patient {
private String name;
private int age;
private String symptom;
public Patient(String name, int age, String symptom) {
this.name = name;
this.age = age;
this.symptom = symptom;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSymptom() {
return symptom;
}
public void showInfo(){
System.out.printf("[환자등록] %s (%d세), 증상: %s\n", name, age, symptom);
}
}
1-6. HospitalDatabase (싱글턴 구조)
public class HospitalDatabase implements Reportable {
private static HospitalDatabase instance = new HospitalDatabase();
private HospitalDatabase(){}
public static HospitalDatabase getInstance(){
return instance;
}
@Override
public void generateReport(Patient Patient) {
System.out.printf("[저장] %s님의 진료 기록이 저장되었습니다.\n",Patient.getName());
}
}
public interface Reportable {
void generateReport(Patient Patient);
}
1-7. PaymentStrategy (전략 구조)
public class CreditcardPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.printf("[결제] 신용카드로 %d원 결제 완료\n", amount);
}
}
public class CreditcardPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.printf("[결제] 신용카드로 %d원 결제 완료\n", amount);
}
}
public class MobilePayment implements PaymentStrategy{
@Override
public void pay(int amount) {
System.out.printf("[결제완료] 핸드폰으로 %d원 결제완료\n", amount);
}
}
public class CashPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.printf("[결제완료] 현금금으로 %d원 결제완료\n", amount);
}
}
1-8. 알림
public interface Notifiable{
void notify(Patient patient, String message);
}
public class SmsNotifier implements Notifiable {
@Override
public void notify(Patient patient, String message) {
System.out.printf("[알림] %s님에게 문자 발송: %s\n", patient.getName(), message);
}
}