본문 바로가기
프로그래밍/디자인패턴

[자바디자인패턴] 스트레티지 패턴

by hyunleeM 2017. 12. 10.

스트레티지 패턴


- 여러 알고리즘을 하나의 추상적인 접근점(인터페이스)을 만들어 접근점에서 서로 교환 가능하도록 하는 패턴


1) 장점

구현을 활용해서 유연함

캡슐화로 기능군 관리가 편함

기능, 클라이언트 객체가 변경되어도 다른 부분에 영향이 없음 

실행중에 기능에 대한 변경이 가능

2) 단점

객체의 특징 (객체를 생성하는 클래스의 구성)인 상태(state)와 행동(method)을 기능군에서는 상태가 빠지고 기능(행동)만을 구현한거에 대해 객체라는 의미상의 문제가 생길 수 있다.


스트레티지 패턴에 대한 설명을 위와같다.

그리고 두가지 개념으로 이루어지는데 인터페이스와 델리게이트(위임) 이다.


인터페이스 

 - 기능에 대한 선언과 구현 분리

 - 기능을 사용(호출)하는 통로


델리게이트 

 - 위임

 - 특정 기능을 사용하기 위해 다른 객체의 기능을 호출하는것


인터페이스에 대한 내용을 코드로 살펴보자


public interface AInterface {


// 기능에 대한 선언

public void funcA();

}


public class AInterFaceImple implements AInterface {


// 기능구현

@Override

public void funcA() {

System.out.println("AAA");

}


}


AInterface 내부에 기능을 구현할 funcA를 선언 해놓는다. 

AInterFaceImple 구현 클래스에서 AInterface를 상속 받은후에 펑션 내부 내용을 구현한다.


이제 인터페이스를 통해 구현해놓은 내용을 선언해보자.


public class Main {

public static void main(String[] args) {

AInterface ai = new AInterFaceImple();

//funcA사용할수 있는 통로(접점)

ai.funcA();

}


}



console : AAA


인터페이스를 통로로 하여 funcA(기능)를 호출한다.



델리게이트(위임) 에 대한내용도 코드를 통해 살펴보자.



public class AObj {

public void funcAA() {

System.out.println("AAA");

System.out.println("AAA");

// ~ 기능이 필요하니, 구현해주세요.

}

}


AObj에서 funcAA라는 메소드를 통해 AAA 라는 메세지를 두번 찍고 싶다면

System.out.println("AAA");를 두번 찎어주면 될것이다.

그러나 이렇게 하는것보다 위 AInterface를 통하면 구현되어있는 내용을 바로 사용해서 메세지를 찍어줄수 있다 위에 코드를 변경해보자.


public class AObj {

AInterface ai;

public AObj() {

ai = new AInterFaceImple();

}

public void funcAA() {

// 위임하다.

ai.funcA();

ai.funcA();

}

}


위와 같이 AInterface를 통하면 funcAA에서 해야될일을 funcA로 위임처리만 해주면 원하는 기능을 구현할수 있다.


public class Main {

public static void main(String[] args) {

//ai.funcA(); 위임을 통한 funcA두번 호출

AObj aObj = new AObj();

aObj.funcAA();

}


}



console : AAA

 AAA



위 두가지 개념을 이용하여 스트레티지 패턴을 구현해보자.



구현내용


게임에서 캐릭터와 무기를 구현.

무기는 N가지 종류가 있음 (칼, 검, 도끼 등)


캐릭터가 사용하는 무기들의 접근점인 

Weapon 인터페이스를 구현한다.

무기들은 공통적으로 공격이라는 기능을 선언한다.


//무기들이 접근할수 있는 접근점

public interface Weapon {

public void attack();

}



attack구현부가 담긴 무기클래스를 작성한다.



public class Knife implements Weapon{

@Override

public void attack() {

System.out.println("칼 공격");

}

}



Weapon 인터페이스를 통해 무기들을 사용할 GameCharacter 클래스를 작성한다.

캐릭터 클래스는 Weapon인터페이스를 통하여 무기를 교환가능해야 하며,

attack기능을 위임 받아 처리한다.



public class GameCharacter {

//접근점

private Weapon weapon;

// 교환 가능

public void setWebpon(Weapon weapon) {

this.weapon = weapon;

}

public void attack() {

if (weapon == null) {

System.out.println("맨손 공격");

} else {

//델리게이트

weapon.attack();

}

}

}



위에 작성한 내용을 토대로 실행을 해보자.



public class Main {

public static void main(String[] args) {

// Weapon 인터페이스(접근점)를 사용하여 무기 교환가능하게 구현

// GameCharacter의 attach에서 접근점에에 따른 무기에 따라 attack 메소드 위임하여 실행 

GameCharacter character = new GameCharacter();

character.setWebpon(new Knife()); // 칼 할당 

character.attack();

}


}


console : 칼 공격


무기를 교체하고 싶을때는 character.setWebpon(new Axe()); 와 같이 할당해주면 변경이 된다.


위와같이 Weapon이라는 접근점을 통해 무기교환과 위임처리가 된 스트레티지 패턴이 구현되었다.







출처 : https://www.youtube.com/watch?v=UEjsbd3IZvA

http://tiboy.tistory.com/entry/Strategy-Pattern%EC%8A%A4%ED%8A%B8%EB%9E%98%ED%8B%B0%EC%A7%80-%ED%8C%A8%ED%84%B4



'프로그래밍 > 디자인패턴' 카테고리의 다른 글

디자인패턴 강좌 링크  (0) 2017.12.06

댓글