가격을 가져온다.

한국 돈으로 책은 6500원 이며,

일본 돈으로 책은 650엔 이다.

다른 물건도 단순히 '원 / 10 = 엔' 의 공식으로 값이 나오도록 적용한다.


우선 테스트를 작성한다.

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

import java.lang.reflect.Proxy;

import org.junit.Test;

public class PriceTest {
    @Test
    public void getPrice(){
        Price koreanPrice = new KoreanPrice();
        assertThat(koreanPrice.getBookPrice(), is(6500));
        assertThat(koreanPrice.getCarPrice(), is(26000000));
        assertThat(koreanPrice.getPenPrice(), is(1200));
       
        Price japanPrice = (Price)Proxy.newProxyInstance(
                getClass().getClassLoader()
                , new Class[]{Price.class}
                , new JapanPrice(new KoreanPrice()));
        assertThat(japanPrice.getBookPrice(), is(650));
        assertThat(japanPrice.getCarPrice(), is(2600000));
        assertThat(japanPrice.getPenPrice(), is(120));
    }
}

Price 인터페이스

public interface Price{
    int getBookPrice();
    int getCarPrice();
    int getPenPrice();
}

원(W)화로 계산해주는 클래스

public class KoreanPrice implements Price {

    @Override
    public int getBookPrice() {
        return 6500;
    }

    @Override
    public int getCarPrice() {
        return 26000000;
    }

    @Override
    public int getPenPrice() {
        return 1200;
    }
}

Proxy를 이용해 엔화로 계산해 주기 위한 클래스

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class JapanPrice implements InvocationHandler {
    Object price;

    public JapanPrice(Object price) {
        this.price = price;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object obj = method.invoke(price, args);
        return ((Integer) obj) / 10;//단순히 10 나누기
    }
}

책값만 엔화로 계산해 주기 테스트

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class JapanPrice implements InvocationHandler {
	Object price;

	public JapanPrice(Object price) {
		this.price = price;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object obj = method.invoke(price, args);
		if(obj instanceof Integer && method.getName().indexOf("Book") != -1) {
			return ((Integer)obj) / 10;
		}
		return (Integer) obj;
	}
}


import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

import java.lang.reflect.Proxy;

import org.junit.Test;

public class PriceTest {
	@Test
	public void getPrice(){
		Price koreanPrice = new KoreanPrice();
		assertThat(koreanPrice.getBookPrice(), is(6500));
		assertThat(koreanPrice.getCarPrice(), is(26000000));
		assertThat(koreanPrice.getPenPrice(), is(1200));
		
		Price japanPrice = (Price)Proxy.newProxyInstance(
				getClass().getClassLoader()
				, new Class[]{Price.class}
				, new JapanPrice(new KoreanPrice()));
		assertThat(japanPrice.getBookPrice(), is(650));
		assertThat(japanPrice.getCarPrice(), is(26000000));
		assertThat(japanPrice.getPenPrice(), is(1200));
	}
}

Posted by KENSIN
,