๐ ๊ฐ์ฒด ํ๋: ์ ๋ต
13706 ๋จ์ด designpatterns
TL;DR;
์ผ๋ถ ๋ ผ๋ฆฌ ๊ตฌํ์ด ๋ค๋ฅธ ์ ์ฌํ ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ํจํด์ ์ฌ์ฉํ์ญ์์ค. ์ฝ๋์๋ ์ฌ์ฉํ ์ ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐ์ ํ๊ธฐ ์ํ if-else๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
ํ์ ๋ ๋ฒ์งธ ํจํด์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ if-else๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ ์
์ ๋ต ํจํด์ ์ฌ์ฉํ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
๊ณต์ ๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
IStrategy ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ Context ์ ํ์ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ์ปจํ ์คํธ๋ ์ผ๋ถ ์์ ์ ์ด IStrategy ๊ฐ์ฒด์ ์ ๋ฌํฉ๋๋ค.
State Pattern ๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ค๋ฆฌ์ง๋ง ์ ๋ต์ ์ปจํ ์คํธ ์ธ์คํด์คํ ์๊ฐ(์ปจํ ์คํธ๊ฐ ์ธ์คํด์คํ๋ ํ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๋์)์ ํ ๋ฒ ์ค์ ๋ฉ๋๋ค.
๊ตฌํ
์ฝ๋๋ฅผ ์์ฑํด ๋ด ์๋ค.
์ฌ์ ํ ํ๋ ์ด์ด๊ฐ ์์ง๋ง ์ด๋ฒ์๋ ์ฝ๋ฑ์ ๋ ๊ด์ฌ์ด ์์ต๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ ๊ฒ์ ๋๋ค.
export default class Player {
private paramA: number;
private paramB: number;
private paramC: number;
constructor(private codecType: AlgorithmType, private stream: Stream) {
// Setting up params
}
play() {
const algorithm = this.getAlgorithm();
switch (algorithm) {
case 'A':
this.decodeA();
break;
case 'B':
this.decodeB();
break;
case 'C':
this.decodeC();
break;
}
console.log('>>>> Play');
}
private getAlgorithm(): AlgorithmType {
// Some logic happens here to determine appropriate algorithm.
return this.codecType;
}
private decodeA(): Stream {
// Actual algorithm to decode the stream in some way
console.log('>>>> Decoding with A', this.paramA);
return this.stream;
}
private decodeB(): Stream {
// Actual algorithm to decode the stream in some way
console.log('>>>> Decoding with B', this.paramB);
return this.stream;
}
private decodeC(): Stream {
// Actual algorithm to decode the stream in some way
console.log('>>>> Decoding with C', this.paramC);
return this.stream;
}
}
ํ๋ ์ด์ด ํด๋์ค ๋ด์์ ์คํธ๋ฆผ์ ๋์ฝ๋ฉํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๋ค ํน์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํ๋์ง ๊ฒฐ์ ํ๋ switch ๋ฌธ์ด ์์ต๋๋ค. ์ง๊ธ ๋น์ฅ์ ๊ทธ๋ ๊ฒ ๋์์ง๋ ์์ง๋ง ๋์ฝ๋ฉ ๊ธฐ๋ฅ์ด ์์ญ ์ค์ ์ฝ๋๋ฅผ ํฌํจํ ์ ์๋ ์ค์ ์ํฉ์ ์์ํด ๋ณด์ญ์์ค.
์ ๋ต์ด ์ ์ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธ์, ์ด ๋ชจ๋ ๊ฒ์ ํ ๊ฐ์ง ์์ ๋ณํ๋ก ํด๋ด ์๋ค. ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ํด๋์ค๋ฅผ ๋ง๋ค์ง ๋ง์. ์ด๊ฑฐ ๋ด์:
interface Strategy {
decode(stream: Stream, context: DecodeContext): Stream;
}
class StrategyA implements Strategy {
decode(stream: Stream, context: DecodeContext) {
// implementation
}
}
์ฐ๋ฆฌ๋ TypeScript(JavaScript) ์ธ๊ณ์ ์๊ณ , ํจ์๋ ์ผ๊ธ ์๋ฏผ์ ๋๋ค. ์ฐ๋ฆฌ๋ ํจ์๋ฅผ ์ด๋์๋ ์ ๋ฌํ ์ ์๊ณ , ๋จ์ง ํ๋์ ํจ์๋ฅผ ํฌํจํ๊ธฐ ์ํด ํด๋์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ ํจํด ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export default class Player {
private paramA: number;
private paramB: number;
private paramC: number;
constructor(private decode: Decode, private stream: Stream) {
// Setting up params
}
play() {
this.decode(this.stream, {
a: this.paramA,
b: this.paramB,
c: this.paramC,
});
console.log('>>>> Play');
}
}
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋์ฝ๋ฉ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ ์์ฒด ๊ธฐ๋ฅ์ผ๋ก ์๋ํฉ๋๋ค.
export const decodeA: Decode = (stream: Stream, { a }: DecodeContext) => {
// Actual algorithm to decode the stream in some way
console.log('>>>> Decoding with A', a);
return stream;
};
export const decodeB: Decode = (stream: Stream, { b }: DecodeContext) => {
// Actual algorithm to decode the stream in some way
console.log('>>>> Decoding with B', b);
return stream;
};
export const decodeC: Decode = (stream: Stream, { c }: DecodeContext) => {
// Actual algorithm to decode the stream in some way
console.log('>>>> Decoding with C', c);
return stream;
};
๋น์ฉ์ ์ผ๋ง์ ๋๊น?
์ ์ฌ์ ๋จ์ :
์ ์ฌ์ ์ฅ์ :
๊ฒฐ๋ก
๋๋ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์กฐ๊ฑด๋ฌธ์ ํผํ๋ ๊ฒ์ ์ข์ํ๋ฏ๋ก ์ด ํจํด์ ์ง๊ธ๊น์ง ๋์๊ฒ ์ ๋ง ์ ์ฉํด ๋ณด์ ๋๋ค.
์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋ค ๐
Source code if needed
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ๊ฐ์ฒด ํ๋: ์ ๋ต), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/jokerwolf/object-behavioral-strategy-1c3lํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค