π€ μ΄λν° ν¨ν΄μ΄λ?
μ΄λν° ν¨ν΄μ νΈνλμ§ μλ μΈν°νμ΄μ€λ₯Ό κ°μ§ ν΄λμ€λ€μ ν¨κ» μλν μ μλλ‘ νλ ꡬ쑰μ λμμΈ ν¨ν΄μ λλ€. λ§μΉ μ¬νν λ μ¬μ©νλ μ μ μ΄λν°μ²λΌ, μλ‘ λ€λ₯Έ κ·κ²©μ μμ€ν λ€μ μ°κ²°ν΄μ£Όλ μν μ ν©λλ€.
π― μ£Όμ νΉμ§
- κΈ°μ‘΄ μ½λ μμ μμ΄ μλ‘μ΄ μΈν°νμ΄μ€μ ν΅ν©
- λ κ±°μ μμ€ν κ³Ό μλ‘μ΄ μμ€ν κ°μ λΈλ¦Ώμ§ μν
- μμ‘΄μ± μμ μμΉμ λ°λ₯΄λ κΉλν μ€κ³
π Java μμ : λ°λ€ μλ¬Ό μ΄λν°
λ°λ€μ λ€μν μλ¬Όλ€μ΄ μλ‘ λ€λ₯Έ λ°©μμΌλ‘ μμ§μ΄μ§λ§, 곡ν΅λ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ κ΄λ¦¬νλ μμ μ λλ€.
// π κΈ°μ‘΄ λ¬Όκ³ κΈ° μΈν°νμ΄μ€
interface Fish {
void swim();
}
// π¦ μμ΄ ν΄λμ€
class Shark implements Fish {
@Override
public void swim() {
System.out.println("π¦ μμ΄κ° λΉ λ₯΄κ² μμν©λλ€!");
}
}
// π λ¬Έμ΄ ν΄λμ€ (λ€λ₯Έ μΈν°νμ΄μ€)
class Octopus {
public void crawl() {
System.out.println("π λ¬Έμ΄κ° λ°λ₯μ κΈ°μ΄λ€λλλ€!");
}
}
// π§ λ¬Έμ΄ μ΄λν°
class OctopusAdapter implements Fish {
private Octopus octopus;
public OctopusAdapter(Octopus octopus) {
this.octopus = octopus;
}
@Override
public void swim() {
// λ¬Έμ΄μ crawlμ swimμΌλ‘ λ³ν
octopus.crawl();
System.out.println("π« λ¬Έμ΄κ° μμνλ― μ΄λν©λλ€!");
}
}
// π λ°λ€ μνκ³ κ΄λ¦¬μ
class OceanManager {
private List<Fish> marineLife = new ArrayList<>();
public void addFish(Fish fish) {
marineLife.add(fish);
}
public void makeAllSwim() {
System.out.println("π λ°λ€ μλ¬Όλ€μ΄ μμ§μ
λλ€:");
marineLife.forEach(Fish::swim);
}
}
// μ¬μ© μμ
public class AdapterPatternExample {
public static void main(String[] args) {
OceanManager ocean = new OceanManager();
// μΌλ° λ¬Όκ³ κΈ° μΆκ°
ocean.addFish(new Shark());
// λ¬Έμ΄λ₯Ό μ΄λν°λ‘ κ°μΈμ μΆκ°
Octopus octopus = new Octopus();
ocean.addFish(new OctopusAdapter(octopus));
ocean.makeAllSwim();
}
}
βοΈ TypeScript μμ : νλμ λ κ° μ΄λν°
νλμ λλ λ€μν μλ¬Όλ€μ λΉν λ°©μμ ν΅ν©νλ μμ μ λλ€.
// βοΈ κΈ°μ‘΄ λΉν μΈν°νμ΄μ€
interface Flyer {
fly(): void;
}
// π¦
λ
μ리 ν΄λμ€
class Eagle implements Flyer {
fly(): void {
console.log("π¦
λ
μλ¦¬κ° λ κ°λ₯Ό νΌμΉκ³ λΉνν©λλ€!");
}
}
// π ν¬λ¦¬μ½₯ν° ν΄λμ€ (λ€λ₯Έ μΈν°νμ΄μ€)
class Helicopter {
rotate(): void {
console.log("π ν¬λ¦¬μ½₯ν°κ° λ‘ν°λ₯Ό νμ μν΅λλ€!");
}
}
// π§ ν¬λ¦¬μ½₯ν° μ΄λν°
class HelicopterAdapter implements Flyer {
private helicopter: Helicopter;
constructor(helicopter: Helicopter) {
this.helicopter = helicopter;
}
fly(): void {
// ν¬λ¦¬μ½₯ν°μ rotateλ₯Ό flyλ‘ λ³ν
this.helicopter.rotate();
console.log("π« ν¬λ¦¬μ½₯ν°κ° νλμ λ μκ°λλ€!");
}
}
// π 기ꡬ ν΄λμ€ (λ λ€λ₯Έ μΈν°νμ΄μ€)
class Balloon {
float(): void {
console.log("π κΈ°κ΅¬κ° κ³΅μ€μ λ μ€λ¦
λλ€!");
}
}
// π§ 기ꡬ μ΄λν°
class BalloonAdapter implements Flyer {
private balloon: Balloon;
constructor(balloon: Balloon) {
this.balloon = balloon;
}
fly(): void {
// 기ꡬμ floatμ flyλ‘ λ³ν
this.balloon.float();
console.log("π« κΈ°κ΅¬κ° νλμ λ μκ°λλ€!");
}
}
// βοΈ νλ κ΄μ μΌν°
class SkyController {
private flyers: Flyer[] = [];
addFlyer(flyer: Flyer): void {
this.flyers.push(flyer);
}
makeAllFly(): void {
console.log("βοΈ νλμ λͺ¨λ κ²λ€μ΄ λΉνν©λλ€:");
this.flyers.forEach(flyer => flyer.fly());
}
}
// μ¬μ© μμ
const skyController = new SkyController();
// μΌλ° λΉν체 μΆκ°
skyController.addFlyer(new Eagle());
// ν¬λ¦¬μ½₯ν°λ₯Ό μ΄λν°λ‘ κ°μΈμ μΆκ°
const helicopter = new Helicopter();
skyController.addFlyer(new HelicopterAdapter(helicopter));
// 기ꡬλ₯Ό μ΄λν°λ‘ κ°μΈμ μΆκ°
const balloon = new Balloon();
skyController.addFlyer(new BalloonAdapter(balloon));
skyController.makeAllFly();
π Python μμ : λ μ μ΄λ μ΄λν°
λ μμ λ€μν μλ¬Όλ€κ³Ό νκ²λ€μ μ΄λ λ°©μμ ν΅ν©νλ μμ μ λλ€.
from abc import ABC, abstractmethod
# πΆ κΈ°μ‘΄ μ΄λ μΈν°νμ΄μ€
class Walker(ABC):
@abstractmethod
def walk(self):
pass
# π¦ μΌλ£©λ§ ν΄λμ€
class Zebra(Walker):
def walk(self):
print("π¦ μΌλ£©λ§μ΄ λ€ λ°λ‘ κ±Έμ΄κ°λλ€!")
# π λ± ν΄λμ€ (λ€λ₯Έ μΈν°νμ΄μ€)
class Snake:
def slither(self):
print("π λ±μ΄ λͺΈμ ꡬλΆκ±°λ¦¬λ©° κΈ°μ΄κ°λλ€!")
# π§ λ± μ΄λν°
class SnakeAdapter(Walker):
def __init__(self, snake: Snake):
self.snake = snake
def walk(self):
# λ±μ slitherλ₯Ό walkλ‘ λ³ν
self.snake.slither()
print("π« λ±μ΄ κ±Έμ΄κ°λ― μ΄λν©λλ€!")
# π μλμ°¨ ν΄λμ€ (λ λ€λ₯Έ μΈν°νμ΄μ€)
class Car:
def drive(self):
print("π μλμ°¨κ° λ°ν΄λ₯Ό κ΅΄λ € λ¬λ¦½λλ€!")
# π§ μλμ°¨ μ΄λν°
class CarAdapter(Walker):
def __init__(self, car: Car):
self.car = car
def walk(self):
# μλμ°¨μ driveλ₯Ό walkλ‘ λ³ν
self.car.drive()
print("π« μλμ°¨κ° κ±Έμ΄κ°λ― μ΄λν©λλ€!")
# π± λ‘λ΄ ν΄λμ€ (λ λ€λ₯Έ μΈν°νμ΄μ€)
class Robot:
def move_mechanically(self):
print("π€ λ‘λ΄μ΄ κΈ°κ³μ μΌλ‘ μμ§μ
λλ€!")
# π§ λ‘λ΄ μ΄λν°
class RobotAdapter(Walker):
def __init__(self, robot: Robot):
self.robot = robot
def walk(self):
# λ‘λ΄μ move_mechanicallyλ₯Ό walkλ‘ λ³ν
self.robot.move_mechanically()
print("π« λ‘λ΄μ΄ κ±Έμ΄κ°λ― μ΄λν©λλ€!")
# π μ§μ κ΄λ¦¬μ
class GroundManager:
def __init__(self):
self.walkers = []
def add_walker(self, walker: Walker):
self.walkers.append(walker)
def make_all_walk(self):
print("π λ
μμ λͺ¨λ κ²λ€μ΄ μ΄λν©λλ€:")
for walker in self.walkers:
walker.walk()
# μ¬μ© μμ
if __name__ == "__main__":
ground_manager = GroundManager()
# μΌλ° 보νμ μΆκ°
ground_manager.add_walker(Zebra())
# λ±μ μ΄λν°λ‘ κ°μΈμ μΆκ°
snake = Snake()
ground_manager.add_walker(SnakeAdapter(snake))
# μλμ°¨λ₯Ό μ΄λν°λ‘ κ°μΈμ μΆκ°
car = Car()
ground_manager.add_walker(CarAdapter(car))
# λ‘λ΄μ μ΄λν°λ‘ κ°μΈμ μΆκ°
robot = Robot()
ground_manager.add_walker(RobotAdapter(robot))
ground_manager.make_all_walk()
π‘ μ΄λν° ν¨ν΄μ μ₯μ
β μ₯μ
- κΈ°μ‘΄ μ½λ μμ μμ΄ μλ‘μ΄ κΈ°λ₯ ν΅ν©
- λ¨μΌ μ± μ μμΉ μ€μ
- λ κ±°μ μμ€ν κ³Όμ νΈνμ± μ μ§
- μ½λ μ¬μ¬μ©μ± μ¦κ°
β οΈ μ£Όμμ¬ν
- μ½λ 볡μ‘λ μ¦κ° κ°λ₯
- λ무 λ§μ μ΄λν° μ¬μ© μ μ±λ₯ μ ν
- μΈν°νμ΄μ€ λ³κ²½ μ μ΄λν°λ μμ νμ
π― μΈμ μ¬μ©ν΄μΌ ν κΉ?
- λ κ±°μ μμ€ν μ μλ‘μ΄ μμ€ν κ³Ό ν΅ν©ν λ
- μΈλΆ λΌμ΄λΈλ¬λ¦¬μ μΈν°νμ΄μ€κ° λ§μ§ μμ λ
- μλ‘ λ€λ₯Έ λ°μ΄ν° νμμ λ³νν΄μΌ ν λ
- λ§μ΄ν¬λ‘μλΉμ€ κ°μ ν΅μ μΈν°νμ΄μ€ ν΅ν©
π λ§λ¬΄λ¦¬
μ΄λν° ν¨ν΄μ μννΈμ¨μ΄ κ°λ°μμ λ§€μ° μ€μ©μ μΈ ν¨ν΄μ λλ€. λ§μΉ μ€μνμ μ΄λν°μ²λΌ, μλ‘ λ€λ₯Έ μμ€ν λ€μ μ°κ²°νμ¬ λ ν° κ°μΉλ₯Ό μ°½μΆν μ μκ² ν΄μ€λλ€.
νΈνλμ§ μλ μΈν°νμ΄μ€ λλ¬Έμ κ³ λ―Όμ΄ μλ€λ©΄, μ΄λν° ν¨ν΄μ μ μ©ν΄λ³΄μΈμ! π
λκΈ