Role Change

์—ญํ• ๋ณ€๊ฒฝ ํŒจํ„ด(Role Change Pattern)์€ ๊ฐ์ฒด๊ฐ€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ž์‹ ์˜ ์—ญํ• (ํ–‰์œ„)์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

           +--------------+
           |    Person    |  <-- ํ•ต์‹ฌ ๊ฐ์ฒด (์—ญํ• ์„ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌ)
           +--------------+
           | - roles: List<Role> |
           +--------------+
                   โ”‚
                   โ”‚ ์—ญํ•  ์œ„์ž„
                   โ–ผ
           +--------------+
           |   Role       |  <-- ์—ญํ•  ์ธํ„ฐํŽ˜์ด์Šค (๊ณตํ†ต ํ–‰์œ„ ์ •์˜)
           +--------------+
           | + execute()  |
           +--------------+
             /           \
            /             \
           โ–ผ               โ–ผ
+----------------+  +------------------+
| StudentRole    |  | EmployeeRole     |
| (๊ตฌ์ฒด์  ์—ญํ• )   |  | (๊ตฌ์ฒด์  ์—ญํ• )     |
+----------------+  +------------------+

์ฆ‰, ํ•ต์‹ฌ ๊ฐ์ฒด(์˜ˆ: Person)๊ฐ€ ๋‹ค์–‘ํ•œ ์—ญํ• (Role)๋“ค์„ ์™ธ๋ถ€์—์„œ ๋ถ€์—ฌ๋ฐ›์•„, ๊ทธ ์—ญํ• ์— ๋”ฐ๋ฅธ ํ–‰๋™์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ ์ƒ์† ๋Œ€์‹  ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋Ÿฐํƒ€์ž„ ์‹œ ์—ญํ• ์„ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

How do Code?

public interface Role {
    void execute();
}

// StudentRole: Role ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํ•™์ƒ ์—ญํ• ์„ ์ˆ˜ํ–‰
public class StudentRole implements Role {
    @Override
    public void execute() {
        System.out.println("StudentRole: ๊ณต๋ถ€ํ•˜๋Š” ์ค‘...");
    }
}

// EmployeeRole: Role ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ง์› ์—ญํ• ์„ ์ˆ˜ํ–‰
public class EmployeeRole implements Role {
    @Override
    public void execute() {
        System.out.println("EmployeeRole: ์ผํ•˜๋Š” ์ค‘...");
    }
}

// Person ํด๋ž˜์Šค: ์—ญํ• ์„ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๊ฐ์ฒด
import java.util.ArrayList;
import java.util.List;

public class Person {
    private List<Role> roles = new ArrayList<>();

    // ์—ญํ•  ์ถ”๊ฐ€
    public void addRole(Role role) {
        roles.add(role);
    }

    // ์—ญํ•  ์ œ๊ฑฐ
    public void removeRole(Role role) {
        roles.remove(role);
    }

    // ๋ถ€์—ฌ๋œ ๋ชจ๋“  ์—ญํ• ์˜ ํ–‰๋™์„ ์‹คํ–‰
    public void performRoles() {
        for (Role role : roles) {
            role.execute();
        }
    }
}

Last updated