티스토리 뷰

전략패턴


전략패턴 = 의존성 역전 + 리스코프 치환원칙( 느슨한 결합 )


▶의존성 역전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package di02_2;
 
public class Kid {
    public static void main(String[] args) {
        
        Attackable attack = new PunchAttack();
        Robot robot = new Robot(attack); //생성자에 주입 Constructor Injection
        
//        robot.setAttack(attack); // 세터에 주입 Setter Injection
        
        robot.fight();
    }
    
}
cs
☞ 내가 생성해야될 객체를 내가 만들지 않고 나를 사용하는 놈이 객체를 대신 생성해서 나한테 넘겨줌

RoboRobot 클래스에서 Attack들이 쓰여짐 → Robot에서 Attack들의 객체를 만들지 않고 Kid에서 Robot도 만들고 Attack도 만들어서 사용


▶리스코프 치환원칙( 느슨한 결합 )


1
2
3
4
5
6
package di02_2;
 
public interface Attackable {
    public void attack();
}
 
cs
1. 사용할 기능에 대해 추상적으로 명시 ( Interface에 메소드 명시 )
1
2
3
4
5
6
7
package di02_2;
 
public class MissileAttack implements Attackable {
    public void attack(){
        System.out.println("미사일어택");
    }
}
cs

1
2
3
4
5
6
7
8
package di02_2;
 
public class PunchAttack implements Attackable {
    public void attack(){
        System.out.println("펀치어택");
    }
}
 
cs
2. 사용할 기능의 타입을 1에서 명시한 추상적인 타입으로

3. 추상적인 Attack기능에 대해 구체적으로 구현( Missile 인지 Punch 인지 )하는 클래스들을 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package di02_2;
 
public class Robot {
    private Attackable attack;
    
    public Robot(Attack attack){ // Constructor Injection
        this.attack = attack;
    }
    
//    public void setAttack(Attack attack) { //Setter Injection
//        this.attack = attack;
//    }
 
    public void fight(){
        System.out.println("로봇이 싸워요");
        attack.attack();
    }
}
cs
3. Attackable 인터페이스를 두 클래스가 implements 했으니 Attackable 참조자료형으로 사용 ( 다형성 )



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
Total
Today
Yesterday