CS/λ””μžμΈ νŒ¨ν„΄

[λ””μžμΈ νŒ¨ν„΄] λ°μ½”λ ˆμ΄ν„°(Decorator) νŒ¨ν„΄

벼리01 2024. 1. 13. 22:23

λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ€ ꡬ쑰 νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€κ°€ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. 

 

// Component μΈν„°νŽ˜μ΄μŠ€
interface Component {
    String operation();
}

// RealComponent 클래슀
class RealComponent implements Component {
    @Override
    public String operation() {
        return "String";
    }
}

 

// Decorator μΈν„°νŽ˜μ΄μŠ€
interface Decorator extends Component {
}

// RealDecorator 클래슀
class RealDecorator implements Decorator {
    private Component component;

    public RealDecorator(Component component) {
        this.component = component;
    }

    @Override
    public String operation() {
        return "(((" + component.operation() + ")))";
    }
}

 

// AnotherDecorator 클래슀
class AnotherDecorator implements Decorator {
    private Component component;

    public AnotherDecorator(Component component) {
        this.component = component;
    }

    @Override
    public String operation() {
        return "****" + component.operation() + "****";
    }
}

 

// Client 클래슀
public class Client {
    private String decoratedString1;
    private String decoratedString2;
    private String decoratedString3;

    public Client(Component realComponent) {
        // 첫 번째 λ°μ½”λ ˆμ΄ν„° 생성
        decoratedString1 = new RealDecorator(realComponent).operation();

        // 두 번째 λ°μ½”λ ˆμ΄ν„° 생성
        decoratedString2 = new AnotherDecorator(realComponent).operation();

        // μ„Έ 번째 λ°μ½”λ ˆμ΄ν„° 생성 (두 개의 λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‘°ν•©)
        decoratedString3 = new AnotherDecorator(new RealDecorator(realComponent)).operation();
    }

    public String getDecoratedString1() {
        return this.decoratedString1;
    }

    public String getDecoratedString2() {
        return this.decoratedString2;
    }

    public String getDecoratedString3() {
        return this.decoratedString3;
    }
}

 

// Main 클래슀
public class Main {
    public static void main(String[] args) {
        // κΈ°λ³Έ 객체 생성
        Component realComponent = new RealComponent();

        // Client 객체 생성
        Client client = new Client(realComponent);

        // Clientλ₯Ό μ‚¬μš©ν•˜μ—¬ λ©”μ„œλ“œ 호좜
        System.out.println(client.getDecoratedString1());
        System.out.println(client.getDecoratedString2());
        System.out.println(client.getDecoratedString3());
    }
}

// 좜λ ₯

// (((String)))
// ****String****
// ****(((String)))****

 

 

λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ—μ„œ λ°μ½”λ ˆμ΄ν„°μ™€ μ‹€μ œ κ°μ²΄λŠ” ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.

1. `RealComponent` ν΄λž˜μŠ€λŠ” `Component` μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.

2. `Decorator` μΈν„°νŽ˜μ΄μŠ€λŠ” `Component` μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ”λ‹€.

3. `RealDecorator` ν΄λž˜μŠ€μ™€ `AnotherDecorator` ν΄λž˜μŠ€λŠ” `Decorator` μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.

 

μœ„ μ½”λ“œλ₯Ό λ°˜μ˜ν•œ 상속 κ³„μΈ΅λ„λŠ” λ‹€μŒκ³Ό κ°™λ‹€.