22.02.20_전략패턴-패턴적용하기
본문 바로가기
CS Study/디자인패턴

22.02.20_전략패턴-패턴적용하기

by KyeongMin 2022. 2. 21.
728x90
반응형

01.패턴적용 - 생성자에 넣기

01.1 BlueLightRedLight

public class BlueLightRedLight{
    
    private Speed speed;
    public BlueLightRedLight(Speed speed){
        this.speed = speed;
    }
    
    public void blueLight(){
        speed.blueLight();
	}
    
    public void redLight(){
        speed.redLight();
	}
}
  • context로 남아있어야함

01.2 Speed

public interface Speed{
    public void blueLight();
    public void redLight();
}
  • 전략

01.3 Normal

publci class Normal implements Speed{
    @Override
    public void blueLight(){
        System.out.println("무 궁 화    꽃    이");
	}
    
    @Override
    public void redLight(){
        System.out.println("피 었 습 니  다.");
    }
}

01.4 Faster

publci class Faster implements Speed{
    @Override
    public void blueLight(){
         	System.out.println("무궁화꽃이");
	}
    
    @Override
    public void redLight(){
        	System.out.println("피었습니다.");
    }
}

01.5 Client

public class Client{
    
    public static void main(String[] args){
		BlueLightRedLight game = new BlueLightRedLight(new Normal());
        game.blueLight();
        game.redLight();
    }
}

02.패턴적용 - operater에 넣기

02.1 BlueLightRedLight

public class BlueLightRedLight{
       
    public void blueLight(Speed speed){
        speed.blueLight();
	}
    
    public void redLight(Speed speed){
        speed.redLight();
	}
}
  • context로 남아있어야함

02.2 Speed

public interface Speed{
    public void blueLight();
    public void redLight();
}
  • 전략

02.3 Normal

publci class Normal implements Speed{
    @Override
    public void blueLight(){
        System.out.println("무 궁 화    꽃    이");
	}
    
    @Override
    public void redLight(){
        System.out.println("피 었 습 니  다.");
    }
}

02.4 Faster

publci class Faster implements Speed{
    @Override
    public void blueLight(){
         	System.out.println("무궁화꽃이");
	}
    
    @Override
    public void redLight(){
        	System.out.println("피었습니다.");
    }
}

02.5 Client

public class Client{
    
    public static void main(String[] args){
		BlueLightRedLight game = new BlueLightRedLight();
        game.blueLight(new Normal());
        game.redLight(new Faster());
    }
}
  • 이렇게 하면 전략을 선택 할 수 있음

3.전략 패턴을 적용하면 좋은것

  • 만약에 Fastest를 추가하는 상황이면 기존을 코드를 건들지 않음
publci class Fastest implements Speed{
    @Override
    public void blueLight(){
         	System.out.println("무광꼬치");
	}
    
    @Override
    public void redLight(){
         	System.out.println("폈슴돠");
    }
}
  • 전략을 추구하더라도 BlueLightRedLight는 바꾸지 않아도 동작함
    • open closed principle가 적용되는 것
public class Client{
    
    public static void main(String[] args){
		BlueLightRedLight game = new BlueLightRedLight();
        game.blueLight(new Normal());
        game.redLight(new Fastest());
        
        game.blueLight(new Speed(){
           @Override
            public void blueLight(){
                System.out.println("blue light");
            }
            
           @Override
            public void redLight(){
                System.out.println("red light");
            }
        });

    }
}
  • 위와 같이 익명 내부 클래스를 사용해서 직접 클래스 만들지 않고
    • 메소드를 출력하는 순간에 원하는 전략을 구현해서 넣을 수 있음
    • 자바에 있는Comparator에서 많이 씀
      • Collections.sort(null, new Comparator<object>(){});

https://github.com/3DPIT/study/blob/master/05.%EC%BD%94%EB%94%A9%EC%9C%BC%EB%A1%9C%ED%95%99%EC%8A%B5%ED%95%98%EB%8A%94GoF%EC%9D%98%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/03.%ED%96%89%EB%8F%99%EA%B4%80%EB%A0%A8%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/09.%EC%A0%84%EB%9E%B5%ED%8C%A8%ED%84%B4/02.%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/22.02.20_%EC%A0%84%EB%9E%B5%ED%8C%A8%ED%84%B4-%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0.md

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글