package com.haenin.section05.dependencyinversion.problem;

/* 설명.
*   의존성 역전 원칙(Denpendency Inversion Principle) -"자식에게 의존하면 자식 때문에 휘둘려!"
*   - 고수준 모듈은 저수준 모듈에 의존해서는 안된다. (둘 다 추상화에 위존해야 한다.)
*   - 추상화는 세부 사항에 의존해서는 안된다. 세부 사항이 추상화에 의존해야 한다.
* */
public class Application {
    public static void main(String[] args) {
        BadNotificationService badService = new BadNotificationService();
        badService.sendNotification(1,"중요 공지사항입니다."); // 1은 email
        badService.sendNotification(2,"중요 공지사항입니다."); // 2는 sms
    }
}

package com.haenin.section05.dependencyinversion.problem;

public class BadNotificationService {
    /* 설명.
    *   구현 클래스에 대해 직접 의존(강한 결합)
    *   - 메세지 전송 방식이 추가되면 필드 및 메소드 안의 코드도 수정
    *     심지억 각 메세지 전송 방식에 따른 클래스와 메세지 전송 메소드도
    *     메소드명이 규약으로 통일되어 있지않다. (세부사항에 의존적, 추상화X)
    * */

    private BadEmailSender emailSender = new BadEmailSender();
    private BadSMSSender smsSender = new BadSMSSender();

    public void sendNotification(int separate, String message){
        if(separate == 1) emailSender.sendEmail(message);
        else if( separate == 2) smsSender.sendSMS(message);
    }
}

package com.haenin.section05.dependencyinversion.problem;

public class BadEmailSender
{
    public void sendEmail(String message) {
        System.out.println("이메일 발송: " + message);
    }
}

package com.haenin.section05.dependencyinversion.problem;

public class BadSMSSender {
    public void sendSMS(String message) {
        System.out.println("문자 발송: " + message);
    }
}