"자바 엔터프라이즈 개발을 평하게 해주는 오픈소스 경량급 애플리케이션 프레임워크"
"OOP 프레임워크"
"호출당하는 쪽의 메소드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴"
ex) JDBC, JRE
"제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴"
public interface IService {
String runSomthing();
}
public class Service implements IService {
@Override
public String runSomthing() {
return "서비스1";
}
}
public class Proxy implements IService {
IService service1;
@Override
public String runSomthing() {
System.out.println("호출에 대한 흐름 제어가 주목적, 반환결과를 그대로 전달.");
service1 = new Service();
return service1.runSomthing();
}
}
public class ClientWithProxy {
public static void main(String[] args) {
// 프록시를 이용한 호출
IService proxy = new Proxy();
System.out.println(proxy.runSomthing());
}
}
/** 출력값
호출에 대한 흐름 제어가 주목적, 반환결과를 그대로 전달.
서비스1
*/
"메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴"
"클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴"
< 필요한 요소 >
- new를 실행할 수 옶도록 생성자에 private 접근 제어자를 지정한다.
- 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.
- 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다.
public class Singleton {
static Singleton singletonObject; // 정적 참조 변수
private Singleton() {}; // private 생성자
// 객체 반환 정적 메서드
public static Singleton getInstance() {
if(singletonObject == null) {
singletonObject = new Singleton();
}
return singletonObject;
}
}
public class Client {
public static void main(String[] args) {
// private 생성자이므로 new를 통해 인스턴스를 생성할 수 없음
// Singleton s = new Singleton();
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
Singleton s3 = Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
/**
com.grace.oop.singleton.Singleton@26f0a63f
com.grace.oop.singleton.Singleton@26f0a63f
com.grace.oop.singleton.Singleton@26f0a63f
*/
}
}
" 상위 클래스의 경본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴"
"오버라이드된 메서드가 객체를 반환하는 패턴"
"클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴"
< 필요한 요소 >
- 전략 메서드를 가진 전략 객체
- 전략 객체를 사용하는 컨텍스트 (전략 객체의 사용자/소비자)
- 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트 (제3자, 전략 객체의 공급자)
public interface Strategy {
public abstract void runStrategy();
}
public class StrategyGun implements Strategy{
@Override
public void runStrategy() {
System.out.println("총: 탕 탕 탕 탕");
}
}
public class StrategyBow implements Strategy {
@Override
public void runStrategy() {
System.out.println("활: 슝 슝 슝");
}
}
public class Soldier {
void runContext(Strategy strategy) {
System.out.println("전투 시작");
strategy.runStrategy();
System.out.println("전투 종료");
}
}
public class Client {
public static void main(String[] args) {
Strategy strategy = null;
Soldier rambo = new Soldier();
// 총을 람보에게 전달해서 전투를 수행하게 한다.
strategy = new StrategyGun();
rambo.runContext(strategy);
System.out.println();
// 활을 람보에게 전달해서 전투를 수행하게 한다.
strategy = new StrategyBow();
rambo.runContext(strategy);
}
}
/** 출력값
전투 시작
총: 탕 탕 탕 탕
전투 종료
전투 시작
활: 슝 슝 슝
전투 종료
*/
"전략을 익명 내부 클래스로 구연한 전략 패턴"
public interface Strategy {
public abstract void runStrategy();
}
public class Soldier {
void runContext(String weapon) {
System.out.println("전투 시작");
executeWeapon(weapon).runStrategy();
System.out.println("전투 종료");
}
private Strategy executeWeapon(final String weapon) {
return new Strategy() {
@Override
public void runStrategy() {
System.out.println(weapon);
}
};
}
}
public class Client {
public static void main(String[] args) {
Soldier rambo = new Soldier();
rambo.runContext("총 총 총 총 총");
System.out.println();
rambo.runContext("활 활 활 활 활");
}
}
/** 출력값
전투 시작
총 총 총 총 총
전투 종료
전투 시작
활 활 활 활 활
전투 종료
*/