티스토리 뷰

Code의 일부를 파라미터로 전달하는 기능 하여 기능을 실행하는 것으로 어떻게 실행할 것 인지 결정하지 않는 코드 블록을 의미한다. 3. JAVA 일급객체에서 살펴본 방법이 1차 적인 방법으로 참 또는 거짓을 반환하는 함수를 프리디 게이트(Predicate)라고 한다.

다양성을 적용 해서 JAVA 일급 객체의 소스를 다양한 방법으로 변경합니다.

  • Class 사용
  • 익명 Class 사용
  • 람다 사용 

1. Interface 생성

CarCondition Interface의 이름을 CarPredicate로 변경합니다.

public interface CarPredicate {
  boolean test(Car car);
}

2. Class 사용

디자인 패턴 중  알고리즘(기능) 울 캡슐화하여 미리 정해 놓은 후 사용시점(런타임) 시점에 선택하여 사용하는 패턴인 전략 디자인 패턴 (Strategy Design Pattern)을 적용합니다..

2-1. CarPredicate에 대한 구현체를 작성  

전략 디자인 패턴 (Strategy Design Pattern)은 다양한 알고리즘(기능)을 미리 정의해 놓고 선택적을 시용하는 것으로 CarPredicate를 상속받아서 수행할 다 열한 알고리즘(기능)을 정의합니다.

public class CaeCompanySamsung implements CarPredicate{
  @Override
  public boolean test(Car car) {
    return Constant.COMPANY_SAMSUNG.equals(car.getCompany());
  }
}

public class CarBlankColor implements CarPredicate{
  @Override
  public boolean test(Car car) {
    return Constant.COLOR_BLACK.equals(car.getColor());
  }
}

2-2. Car 필터를 위한 서비스 메서드를 생성  

알고리즘을 파라미터로 받아서 수행하는 기능을 담당하는 기능으로 수행할 알고리즘(기능)을 사용 시점에 받아서 동작을 수행합니다.  동작 파라미터는 이 부분을 의미합니다, 즉 filterCar Method의 CarPredicate carPredicate을 의미합니다.

public List<Car> filterCar(List<Car> cars, CarPredicate carPredicate) {
    // 반환 값을 위한 반환 값
    List<Car> rnCars = new ArrayList<>();

    for ( Car car : cars) {
      if (carPredicate.test(car)) {
        rnCars.add(car);
      }
    }

    return rnCars;
  }

2-3. 메인 합수 작성

  public static void main(String[] args) {

    List<Car> cars = new ArrayList<>();
    cars.add(new Car("소나타", "검정", "현대"));
    cars.add(new Car("SM5", "검정", "삼성"));
    cars.add(new Car("SM5", "흰색", "삼성"));

    CarService carService = new CarService();
    List<Car> carBlacks = carService.filterCar(cars, new CarBlankColor());
    System.out.println("-------------------------------");
    System.out.println(carBlacks.toString());
    
    List<Car> carSamsungs = carService.filterCar(cars, new CaeCompanySamsung());
    System.out.println("-------------------------------");
    System.out.println(carSamsungs.toString());
  }

filterCar 메서드를 수행할 때 파라미터로 CarPredicate의 구현체 기능을 생성하여 전달하여 수행합니다. 다음은 수행한 결과입니다.

-------------------------------
[Car {name='소나타', color='검정', company='현대'}, Car {name='SM5', color='검정', company='삼성'}]
-------------------------------
[Car {name='SM5', color='검정', company='삼성'}, Car{name='SM5', color='흰색', company='삼성'}]

3. 익명 함수 사용 

Strategy Design Pattern을 사용하여 객체를 만들고 하는 것은 귀찮은 작업입니다, 이 작업 대신 익명 함수를 사용하면 편하게 작업을 할 수 있습니다. 

    List<Car> aonymousCar = carService.filterCar(cars, new CarPredicate() {
      @Override
      public boolean test(Car car) {
        return "소나타".equals(car.getName());
      }
    });

    System.out.println("-------------------------------");
    System.out.println(aonymousCar.toString());

4. 람다 사용 

람다를 사용 하면 쉽게 작성할 수 있습니다.

    List<Car> lamdaCar = carService.filterCar(cars, (Car car)->"소나타".equals(car.getName()));
   
    System.out.println("-------------------------------");
    System.out.println(lamdaCar.toString());

5. 추상화

filterCar를 추상화 하면 Stream 객체의 filter처럼 동작합니다.

  public <T> List<T> filter(List<T> ts, Predicate<T> p) {
    List<T> rnCars = new ArrayList<>();

    for ( T e : ts) {
      if (p.test(e)) {
        rnCars.add(e);
      }
    }

    return rnCars;
  }

 

1. 전체 소스 : 동작파라미터

 

GitHub - hyomee/code

Contribute to hyomee/code development by creating an account on GitHub.

github.com

 

참고 : 
1. Strategy Design Pattern : 전략디자인 패턴 wiki

 

전략 패턴 - 위키백과, 우리 모두의 백과사전

전략 패턴(strategy pattern) 또는 정책 패턴(policy pattern)은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. 전략 패턴은 특정한 계열의 알고리즘들을 정의하고 각 알고

ko.wikipedia.org

 

'프로그램이야기' 카테고리의 다른 글

6. 람다이야기 2  (0) 2022.06.14
5. 람다 이야기 1  (0) 2022.06.02
3. 동작 파라미터 1 - 일급객체  (0) 2022.06.01
3. Java enum  (0) 2022.05.13
2. 불변값, 가변값은 무엇을 의미 할까 ?  (0) 2022.03.17