💠 데코레이터(Decorator) 패턴 - 완벽 마스터하기
Decorator Pattern 데코레이터 패턴(Decorator Pattern)은 대상 객체에 대한 기능 확장이나 변경이 필요할때 객체의 결합을 통해 서브클래싱 대신 쓸수 있는 유연한 대안 구조 패턴이다. Decorator을 해석하
inpa.tistory.com
Decorator Pattern
- 객체에대한 기능의 확장이나 변경이 필요할 때, 기존 코드를 변경하지 않고 추가하여 쓸 수 있는 구조 패턴
- 피자위에 토핑을 올려주듯이 객체에 계속해서 기능을 추가해갈 수 있다.
- 추가할 기능이 생겼을 때에 concrete Decorator 를 늘리거나 혹은 또 다른 decorator는 추가해도 된다.
Decorator pattern 예제
- 기본 기능만 있는 총(Base Weapon)을 여러 악세사리(WeaponAccessory)를 총에 장착(Decorator) 시킴으로써
유탄 발사도 되고 스코프 기능도 되는 멋진 총 객체를 구성하려함
weapon을 implement한 각각의 클래스를 만들면 클래스가 너무 많아지고 코드가 복잡해지게 된다.
따라서 각각 무기 액세서리 클래스들을 미리 정의해주고,
new BaseWeapon(new Generate(new Scoped())) 이런식으로 생성자를 감싸듯이 구성하며, 마치 동적으로 무기 액세서리를 자유도록 붙이도록 구성해주면 된다.
클래스 구조는 아래와 같다.
아래는 코드
public class Main {
public static void main(String[] args) {
Weapon generade_rifle = new Generade(new BaseWeapon());
generade_rifle.aim_and_fire();
Weapon buttstock_scoped_rifle = new Buttstock(new Scoped(new BaseWeapon()));
buttstock_scoped_rifle.aim_and_fire();
Weapon buttstock_scpoed_generade_rifle = new Buttstock(new Scoped(new Generade( new BaseWeapon())));
buttstock_scpoed_generade_rifle.aim_and_fire();
}
}
public interface Weapon {
void aim_and_fire();
}
public class BaseWeapon implements Weapon{
@Override
public void aim_and_fire() {
System.out.println("총알 발사");
}
}
public abstract class WeaponAccessory implements Weapon{
private Weapon rifle;
WeaponAccessory(Weapon rifle) {
this.rifle = rifle;
}
@Override
public void aim_and_fire(){
rifle.aim_and_fire();
}
}
public class Generade extends WeaponAccessory{
Generade(Weapon rifle) {
super(rifle);
}
@Override
public void aim_and_fire() {
super.aim_and_fire(); //부모 메서드를 호출함으로써 자신을 감싸고 있는 장식자(WeaponAccessory)의 메서드 호출
generade_fire();
}
public void generade_fire() {
System.out.println("generade_fire");
}
}
public class Buttstock extends WeaponAccessory{
Buttstock(Weapon rifle) {
super(rifle);
}
public void aim_and_fire() {
holding();
super.aim_and_fire(); //부모 메서드를 호출함으로써 자신을 감싸고 있는 장식자(WeaponAccessory)의 메서드 호출
}
public void holding() {
System.out.println("buttstock");
}
}
public class Scoped extends WeaponAccessory{
Scoped(Weapon rifle) {
super(rifle);
}
@Override
public void aim_and_fire() {
aiming();
super.aim_and_fire(); //부모 메서드를 호출함으로써 자신을 감싸고 있는 장식자(WeaponAccessory)의 메서드 호출
}
public void aiming(){
System.out.println("aiming");
}
}
출력 결과
총알 발사
generade_fire
buttstock
aiming
총알 발사
buttstock
aiming
총알 발사
generade_fire
'디자인패턴' 카테고리의 다른 글
Composite 패턴이란? (0) | 2024.05.23 |
---|---|
State Pattern (상태패턴) 이란? (0) | 2024.04.25 |
JAVA에서의 Observer 패턴 (0) | 2024.02.09 |
옵저버 패턴 (Observer pattern) 이란? (0) | 2024.02.09 |
Strategy Pattern (0) | 2024.01.22 |