public interface Payment {
void pay(int amount);
}
public class Store {
Payment payment;
public Store(Payment payment) {
this.payment = payment;
}
public void buySomething(int amount){
payment.pay(amount);
}
}
public class Cash implements Payment{
@Override
public void pay(int amount) {
System.out.println(amount +"원 현금 결제");
}
}
public class CashPerf implements Payment{
//현금결제는 유지
Payment cash = new Cash();
@Override
public void pay(int amount) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
//Cash 클래스에는 변경이없고 위아래로 StopWatch클래스를 사용한다
cash.pay(amount);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
}
}
public class StoreTest {
public static void main(String[] args) {
testPay();
}
public static void testPay(){
//Cash클래스의 pay를 감싸고있는 CashPerf의 apy를 사용한다
Payment cashPerf = new CashPerf();
Store store = new Store(cashPerf);
store.buySomething(100);
}
}
//출력
100원 현금 결제
StopWatch '': running time = 374301 ns
---------------------------------------------
ns % Task name
---------------------------------------------
000374301 100%
Cash클래스는 건들이지 않고 CashPerf라는 클래스를 이용하여 Cash의 pay메소드 주변에 추가적인 구현만 한 모습이다
만약, Main함수에서 CashPerf()가 아닌 Cash()클래스로 생성자 생성시 Cash의 pay메소드가 실행된다 -> 100원 현금 결제