λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“šμ½μ€ μ±… 정리/μžλ°” λ§ˆμŠ€ν„°λΆ

[μžλ°” λ§ˆμŠ€ν„°λΆ] 12μž₯ : λ””μžμΈνŒ¨ν„΄ 즐기기 - 행동

객체의 '행동'에 λŒ€ν•œ λ””μžμΈ νŒ¨ν„΄

1. Command 

2. Strategy

3. Iterator

4. Observer

 

12.4.1 Command νŒ¨ν„΄ - 'λͺ…λ Ή'을 μΈμŠ€ν„΄μŠ€λ‘œ μ·¨κΈ‰ν•˜μ—¬ 처리 쑰합을 μ‰½κ²Œ ν•œλ‹€.

처리 λ‚΄μš©μ΄ λΉ„μŠ·ν•œ λͺ…령을 νŒ¨ν„΄μ— 따라 κ΅¬λΆ„ν•˜κ±°λ‚˜ μ‹€ν–‰ν•˜λŠ” μ²˜λ¦¬κ°€ ν•„μš”ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ κ³„μ ˆμ— 따라 λ°”λ€ŒλŠ” ν• μΈμœ¨ 적용이 μžˆμ„ 수 μžˆλ‹€.

 

Command νŒ¨ν„΄μ€ 'λͺ…λ Ή' 자체λ₯Ό μΈμŠ€ν„΄μŠ€λ‘œ μ·¨κΈ‰ν•΄ 처리의 쑰합을 μš©μ΄ν•˜κ²Œ ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

 

  • Book.java
public class Book {
    private double amount;

    public Book(double amount) {
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }
}

 

  • 할인 μ •μ±…
public abstract class Command {
    protected Book book;

    public void setBook(Book book) {
        this.book = book;
    }

    public abstract void execute();
}

public class DiscountCommand extends Command {

    @Override
    public void execute() {
        double amount = book.getAmount();
        book.setAmount(amount * 0.9);
    }
}

public class SpecialDiscountCommand extends Command {

    @Override
    public void execute() {
        double amount = book.getAmount();
        book.setAmount(amount * 0.7);
    }
}

각각의 할인 정책에 λ”°λΌμ„œ 상속받은 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•œλ‹€.

 

  • SampleMain.java
public abstract class SampleMain {
    public static void main(String[] args) {
        Book comic = new Book(5000);
        Book tecnicalBook = new Book(25000);

        Command discountCommand = new DiscountCommand();
        Command specialDiscountCommand = new SpecialDiscountCommand();

        discountCommand.setBook(comic);
        discountCommand.execute();
        System.out.println("할인 ν›„ κΈˆμ•‘μ€ " + comic.getAmount());
        
        specialDiscountCommand.setBook(tecnicalBook);
        specialDiscountCommand.execute();
        System.out.println("할인 ν›„ κΈˆμ•‘μ€ " + tecnicalBook.getAmount());
    }
}

할인 처리λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν΄λž˜μŠ€μ— λ„μ„œμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ •ν•˜κ³ (setBook(?)) executeλ₯Ό μ‹€ν–‰ν•¨μœΌλ‘œμ¨ ν•΄λ‹Ή 클래슀의 할인 정책을 μ μš©μ‹œν‚€λ„λ‘ ν–ˆλ‹€.

μƒˆλ‘œμš΄ 할인 정책이 생긴닀면 Commandλ₯Ό μƒμ†λ°›λŠ” 클래슀λ₯Ό 톡해 μƒˆλ‘œμš΄ 정책을 κ΅¬ν˜„ν•΄μ£ΌκΈ°λ§Œ ν•˜λ©΄λœλ‹€.

 

Command νŒ¨ν„΄μ€ 곡톡 μΈν„°νŽ˜μ΄μŠ€μ™€ 처리의 ν˜ΈμΆœμ„ ν”„λ ˆμž„μ›Œν¬ μͺ½μ—μ„œ κ΅¬ν˜„ν•˜κ³  ν”„λ ˆμž„μ›Œν¬ μ΄μš©μžμ—κ²Œ Command 클래슀λ₯Ό μƒμ†ν•œ ꡬ체적인 처리 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λ„λ‘ ν•˜λŠ” μ‚¬μš©λ²•μ΄ λ§Žλ‹€.

 

12.4.2 Strategy νŒ¨ν„΄ - μ „λž΅μ„ κ°„λ‹¨νžˆ μ „ν™˜ν•  수 μžˆλŠ” ꡬ쑰λ₯Ό 제곡

Command νŒ¨ν„΄μ—μ„œλŠ” κ³„μ ˆκ³Ό μƒν’ˆμ˜ λ‚΄μš©μ— 따라 μ—¬λŸ¬ 개의 할인 νŒ¨ν„΄μ„ λ‚˜λˆ„μ–΄ μ‚¬μš©ν–ˆκ³  μ—¬λŸ¬κ°œμ˜ 할인 νŒ¨ν„΄μ„ μ μš©ν•΄μ•Όν•  λ•Œ νš¨κ³Όμ μ΄μ—ˆλ‹€.

이λ₯Ό κ΅¬ν˜„ν•œ μˆ˜λ‹¨μ΄ ν•˜λ‚˜ 더 μžˆλ‹€. λ°”λ‘œ Strategy νŒ¨ν„΄μ΄λ‹€. 'μ „λž΅'은 κ°„λ‹¨νžˆ λ§ν•˜λ©΄ 처리 μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. Strategy νŒ¨ν„΄μ€ 처리 μ•Œκ³ λ¦¬μ¦˜μ„ 쑰건에 따라 μ‰½κ²Œ μ „ν™˜ν•  수 μžˆλ„λ‘ λ§Œλ“  νŒ¨ν„΄μ΄λ‹€.

 

  • Book.java λŠ” μœ„ Command νŒ¨ν„΄κ³Ό 동일

 

  • Strategy.java
public interface Strategy {
    void discount(Book book);
}

 

  • Strategy μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μ „λž΅ ν΄λž˜μŠ€λ“€
public class DiscountCommand implements Strategy {

    @Override
    public void execute() {
        double amount = book.getAmount();
        book.setAmount(amount * 0.9);
    }
}

public class SpecialDiscountCommand implements Strategy {

    @Override
    public void execute() {
        double amount = book.getAmount();
        book.setAmount(amount * 0.7);
    }
}

 

  • Shop.java
public class Shop {
    private Strategy strategy;

    public Shop(Strategy strategy) {
        this.strategy = strategy;
    }

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void sell(Book book) {
        this.strategy.discount(book);
    }
}

μ „λž΅ νŒ¨ν„΄μ—μ„œλŠ” 각각의 μ „λž΅μ„ μ΄μš©ν•˜λŠ” ν΄λž˜μŠ€κ°€ ν•„μš”ν•˜λ‹€. 이 역할을 Shop ν΄λž˜μŠ€κ°€ ν•˜κ³  μžˆλ‹€.

 

public class SampleMain {
    public static void main(String[] args) {
        Book comic = new Book(5000);
        Book technicalBook = new Book(25000);

        String discountStrategy = new DiscountStrategy();
        String specialDiscountStrategy = new SpecialDiscountStrategy();

        Shop shop = new Shop(discountStrategy);
        shop.sell(comic);
        System.out.println("할인 ν›„ κΈˆμ•‘μ€ "  + comic.getAmount() + "원");

        Shop shop = new Shop(specialDiscountStrategy);
        shop.sell(technicalBook);
        System.out.println("할인 ν›„ κΈˆμ•‘μ€ "  + technicalBook.getAmount() + "원");
    }
}

Command νŒ¨ν„΄μ€ 'λͺ…λ Ή' 자체λ₯Ό 객체화해 처리 λŒ€μƒ(Book)을 내뢀에 λ³΄κ΄€ν•˜κ³  μžˆμ§€λ§Œ Strategy νŒ¨ν„΄μ€ 'μ•Œκ³ λ¦¬μ¦˜' 자체λ₯Ό κ°μ²΄ν™”ν•˜κ³  μžˆλ‹€λŠ” 점에 차이가 μžˆλ‹€. 

Strategy νŒ¨ν„΄μ€ μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜μ„ λ°”κΏ”κ°€λ©° μ‚¬μš©ν•΄μ•Όν•˜λŠ” κ²½μš°μ— μž₯점이 μžˆλ‹€.