본문 바로가기

코드 디자인 패턴/java

[java & 디자인 패턴] Strategy 패턴 정리

개념


  • 객체가 선택할 수 있는 작업 알고리즘을 몇몇 클래스 계층에서 정의하고 런타임에 동적으로 선택할 수 있는 디자인 패턴
  • 구현 클래스에서 알고리즘 군을 정의하고 캡슐화
  • 컨텍스트 클래스에서 구현 클래스를 상호 교체 및 선택할 수 있는 방식
  • 클라이언트 클래스는 컨텍스트 클래스의 추상화 메서드를 통해서 구현 클래스의 알고리즘을 선택한다.
전략 패턴의 주 목적은 행동을 캡슐화하고, 동적으로 알고리즘을 변경하는 기능을 넣는 것이다.

 

구현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에 세팅하여 사용
	
}
}

 

이외 사용 예시


  • 문서 프로그램의 프린트 기능은  프린트 제조사의 구현 방식에 상관없이 기능 선언이 되면, 문맥 클래스에서 이를 동적으로 선택 가능하다.
  • 정렬 알고리즘은 각 구현 클래스를 상황에 맞게 동적으로 선택하여 사용한다.