-
[JAVA]객체 지향 디자인 패턴 - Decorator Pattern(장식자 패턴)프로그래밍/Java 2022. 3. 24. 19:13반응형
Decorator Pattern이란?
- 객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴
- 즉, 사용자가 필요에 따라 기능을 장착하거나, 사용자가 원하는데로 골르려고 할때 사용하기 좋은 패턴이다.
Decorator Pattern Structure(장식자 패턴 구조)이란?
- 인터페이스를 하나 만들고
- 그 인터페이스를 받는 객체를 2개 생성 한다.
- 하나는 기본이 되는 것이고 하나는 decorator를 구현하고 싶은 객체이다.
- 기본이 되는 곳은 인터페이스에서 받은 것을 구현하는 것이 존재하고
- decorator는 Super(상위 클래스)를 이용하여 상위 객체의 모든 내용을 구현하고 추가적으로 할 것을 구현하여 decorator같은 역할을 구현한다.
- 다형성을 이용하여 객체를 생성하게 되면 decorator가 완성 되게 된다.
Decorator Pattern Example
- 먼저 Car 자동차를 주문 할 때 옵션을 추가하며 차를 완성한다고 가정해 보자
- CarOrder라는 인터페이스를 만들고 K3CarOrder와 CarOrderDecorator에 상속을 받는다.
- SheetHit(엉뜨), Bluetooth(블루투스), Cruise(크루즈모드), Sports(스포츠카모드) 기능을 추가 할 수 있다고 보면
- 처음 한대는 Cruise모드 하나만 , 두 번째 자동차는 풀옵션으로 생산한다고 가정 하고 코딩을 짜보자
Carorder와 K3CarOder 구현부
public interface CarOrder { public void order(); } public class K3CarOrder implements CarOrder{ @Override public void order() { System.out.println("K3를 구매하였습니다."); } }
CarOrderDecorator 및 Decorator 옵션들 구현부
//인터페이스 상속을 받고 추상클래스로 만들어 줌 public abstract class CarOrderDecorator implements CarOrder{ private CarOrder decoratedCarOrder; public CarOrderDecorator(CarOrder decoratedCarOrder) { this.decoratedCarOrder = decoratedCarOrder; } @Override public void order() { decoratedCarOrder.order(); } } //엉뜨 구현 public class SheetHit extends CarOrderDecorator{ public SheetHit(CarOrder decoratedCarOrder) { super(decoratedCarOrder); //상위 생성자로 넣기 } @Override public void order() { super.order(); //상위 오더호출 System.out.println("엉뜨 기능 추가"); //자신의 구현부 로직 구현 } //이렇게 작성하게 되면 위에 내용 호출 및 자싱의 구현부 로직을 순환구조로 구현이 가능하다. } //크루즈 모드 public class Cruise extends CarOrderDecorator{ public Cruise(CarOrder decoratedCarOrder) { super(decoratedCarOrder); } @Override public void order() { super.order(); System.out.println("크루즈 기능 추가"); } } //블루투스 public class Bluetooth extends CarOrderDecorator{ public Bluetooth(CarOrder decoratedCarOrder) { super(decoratedCarOrder); } @Override public void order() { super.order(); System.out.println("블루투스 기능 추가"); } } //스포츠 모드 public class Sports extends CarOrderDecorator{ public Sports(CarOrder decoratedCarOrder) { super(decoratedCarOrder); } @Override public void order() { super.order(); System.out.println("스포츠카 기능 추가"); } }
구동하기
public class K3CarTest { public static void main(String[] args) { new K3CarOrder().order(); //K3를 구매하였습니다. new Cruise(new K3CarOrder()).order(); //K3를 구매하였습니다. //크루즈 기능 추가 new Sports(new SheetHit(new Bluetooth(new Cruise(new K3CarOrder())))).order(); //K3를 구매하였습니다. //크루즈 기능 추가 //블루투스 기능 추가 //엉뜨 기능 추가 //스포츠카 기능 추가 } }
반응형'프로그래밍 > Java' 카테고리의 다른 글
[JAVA]객체 지향 디자인 패턴 - Mediator Pattern(중재자 패턴) (0) 2022.03.28 [JAVA]객체 지향 디자인 패턴 - Factory Pattern(팩토리 패턴) (0) 2022.03.28 [JAVA]객체 지향 디자인 패턴 - Template Method Pattern(탬플릿 메소드 패턴) (0) 2022.03.23 [JAVA]객체 지향 디자인 패턴 - Proxy Pattern(대리인 패턴) (0) 2022.03.23 [JAVA]객체 지향 디자인 패턴 - Adapter Pattern(어댑터 패턴) (0) 2022.03.23