티스토리 뷰
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. 전체 소스 : 동작파라미터
참고 :
1. Strategy Design Pattern : 전략디자인 패턴 wiki
'프로그램이야기' 카테고리의 다른 글
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 |