개념
- 객체가 선택할 수 있는 작업 알고리즘을 몇몇 클래스 계층에서 정의하고 런타임에 동적으로 선택할 수 있는 디자인 패턴
- 구현 클래스에서 알고리즘 군을 정의하고 캡슐화
- 컨텍스트 클래스에서 구현 클래스를 상호 교체 및 선택할 수 있는 방식
- 클라이언트 클래스는 컨텍스트 클래스의 추상화 메서드를 통해서 구현 클래스의 알고리즘을 선택한다.
전략 패턴의 주 목적은 행동을 캡슐화하고, 동적으로 알고리즘을 변경하는 기능을 넣는 것이다.
구현1
Strategy (전략)
알고리즘을 정의하는 인터페이스
public abstract class ABSdatabase {
protected String DB;
public abstract void connectDB();
public void insert(int row) {
System.out.println("데이터 삽입: " + row + "개 => 위치: " + this.DB);
}
}
ConcreteStrategy (구체적인 전략)
Strategy 인터페이스를 구현한 구체적인 알고리즘 클래스
public class MySQL extends ABSdatabase {
public MySQL() {
// TODO Auto-generated constructor stub
this.DB = "mySQL";
}
@Override
public void connectDB() {
// TODO Auto-generated method stub
System.out.println("mySQL 연결 작업 완료");
}
}
public class Oracle extends ABSdatabase {
public Oracle() {
// TODO Auto-generated constructor stub
this.DB = "Oracle";
}
@Override
public void connectDB() {
// TODO Auto-generated method stub
System.out.println("Oracle 연결 작업 완료");
}
}
Context (문맥)
클라이언트가 사용하는 인터페이스 및 클래스
알고리즘을 선택할 수 있는 로직이 있다.
Strategy 객체에 대한 참조를 통해 알고리즘을 호출한다.
enum DBTYPE {
MySQL, Oracle
}
public class DBuse {
private ABSdatabase db;
public DBuse() {
// TODO Auto-generated constructor stub
}
public void setDB(DBTYPE dbType) {
switch (dbType) {
case MySQL:
this.db = new MySQL();
break;
case Oracle:
this.db = new Oracle();
break;
default:
break;
}
if (this.db == null) {
System.out.println("db 세팅 에러: 올바른 db가 아닙니다");
} else {
db.connectDB();
}
}
public void insert(int row) {
this.db.insert(row);
}
}
Client 코드
위임 클래스인 컨텍스트 클래스를 호출하여 구현 클래스를 세팅하고 추상 메소드로 알고리즘을 사용한다.
public class Client {
public static void main(String[] args) {
//mySQL로 작업
DBuse dbuse = new DBuse();
dbuse.setDB(DBTYPE.MySQL);
dbuse.insert(20);
// oracle로 변환
dbuse.setDB(DBTYPE.Oracle);
dbuse.insert(40);
// 구현 클래스 추가 시, 위임 클래스인 dbUse에 세팅하여 사용
}
}
이외 사용 예시
- 문서 프로그램의 프린트 기능은 프린트 제조사의 구현 방식에 상관없이 기능 선언이 되면, 문맥 클래스에서 이를 동적으로 선택 가능하다.
- 정렬 알고리즘은 각 구현 클래스를 상황에 맞게 동적으로 선택하여 사용한다.
'코드 디자인 패턴 > java' 카테고리의 다른 글
[java & 디자인 패턴] Bridge 패턴 정리 (0) | 2024.07.17 |
---|---|
[java & 디자인 패턴] Decorator 패턴 정리 (0) | 2024.07.17 |
[java & 디자인 패턴] Facade 패턴 정리 (0) | 2024.07.17 |
[java & 디자인 패턴] Adapter 패턴 정리 (0) | 2024.07.14 |
[java & 디자인 패턴] Observer 패턴 학습 정리 (0) | 2024.07.14 |