- 플러그인 시스템은, 애플리케이션의 기능을 동적으로 확장할 수 있게 해주는 구조
- 핵심 애플리케이션과 플러그인 간의 느슨한 결합
- 런타임에 기능 추가 / 제거 가능
- 확장성과 유연성 제공
- 즉, 실제 애플리케이션에 직접적으로 포함된 기능은 아니고 외부에서 주입하여 동적으로 결합시킬 수 있는 기능이라고 보면 될 것 같다.
- 전략패턴이 떠오른다.
예시
Webpack의 Tapable
interface Plugin {
execute(): void;
}
class Application {
private plugins: Plugin[] = [];
addPlugin(plugin: Plugin): void {
this.plugins.push(plugin);
}
runPlugins(): void {
this.plugins.forEach(plugin => plugin.execute());
}
}
class LoggerPlugin implements Plugin {
execute(): void {
console.log("Logging...");
}
}
class EmailPlugin implements Plugin {
execute(): void {
console.log("Sending email...");
}
}
// 사용 예
const app = new Application();
app.addPlugin(new LoggerPlugin());
app.addPlugin(new EmailPlugin());
app.runPlugins();