์ ๋ต ํจํด
์ ๋ตํจํด์ ๋ง๊ทธ๋๋ก ์ ๋ต์ ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๋๋ก ํด์ฃผ๋ ๋์์ธ ํจํด์ด๋ค. ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ ๋ฐฉ์์ด ํด๋์ค๋ณ๋ก ์บก์ํ๋์ด์๊ณ ํ์ํ ๋ ์ด๋ฅผ ์ง์ ์์ ํ์ง ์๊ณ ์ ๋ต์ ๊ต์ฒดํ์ฌ ์ ์ฐํ๊ฒ ํ์ฅํ๋ ํจํด์ด๋ค.
Context๋ ํ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ ๋ต์ ๋ฐ๊ฟ๋ ์ ์๋ค (์ ๋ต๊ณผ ์ง์ฝ๊ด๊ณ)
Strategy๋ ์ธ๋ถ์์ ํธ์ถํ๋ ๋ฐฉ์์ ๋ช ์ํ๋ค.
ConcreteStrategy๋ ์ ๋ต์ ์ค์ ๋ก ๊ตฌํํ ํด๋์ค์ด๋ค.
๋ฌธ์ ๊ฐ ๋๋ ์ฝ๋๋ฅผ ๋จผ์ ์ดํด๋ณด์.
ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ์ ์ฝ๋
public abstract class Robot {
private String name;
public Robot(String name) {
this.name = name;
}
public String getName() {
return name;
}
// ๊ณต๊ฒฉ
public abstract void attack();
// ์ด๋
public abstract void move();
}
๋ก๋ด์ด ์์ ์ถ์ํด๋์ค๋ก ์๊ณ ์ด๋ฅผ ์์ํ๋ฉด ํ์ ํด๋์ค์ธ Atom์ attack()๊ณผ move()๋ฅผ Atom์ ๋ง๊ฒ ๊ตฌํํ ์ ์๋ค.
ํ์ง๋ง atom์ attack๋๋ move๋ผ๋ 'ํ์'๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด์๋ ๋ฉ์๋์ ์ง์ ์์ ์ด ๋ถ๊ฐํผํ๋ค.
1. ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด ๊ธฐ์กด ์ฝ๋์ ์์ ์ด ํ์ํ๋ฏ๋ก ์ด๋ OCP(๊ฐ๋ฐฉํ์์์น)์ ์๋ฐฐ๋๋ค.
2. ์ค๋ณต์ฝ๋๋ฅผ ์ฌ๋ฌ ํ์ ํด๋์ค์ ์์ฑํ ์ ์์ด ์์ ์ด ํ์ํ ๋ ์ด๋ฅผ ์ผ๊ด์ฑ์๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ค. ์ค๋ณต์ฝ๋์ ๋ณ๊ฒฝ ๋ฐ์ ์ ๊ด๋ จ๋ ๋ชจ๋ ํด๋์ค์ ์์ ์ด ๋ถ๊ฐํผํด์ง๋ค.
ํด๊ฒฐ์ฑ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋ฌด์์ด ๋ณํ๋์๋์ง ์๊ฐํด๋ณด์.
-> ๋ก๋ด ํด๋์ค์์ ๋ก๋ด์ ์ด๋๋ฐฉ์๊ณผ ๊ณต๊ฒฉ ๋ฐฉ์์ด ๋ณํํ๋ค. ์ด๋ฅผ ์บก์ํํด์ ์ฌ์ฉํด๋ณด์.
์ธํฐํ์ด์ค๋ฅผ ํตํด ๋์ ๋ฐฉ์์ ์บก์ํํ๊ณ ์ด๋ฅผ ๊ตฌํํ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ์ธ๋ถ์์ ๋๊ฒจ์ค์ผ๋ง ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ๋ฐฉํ๋ฒฝ์ญํ ์ ์ํํด ๊ธฐ์กด ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ๋ชปํ๋ค. (OCP๋ฅผ ๋ง์กฑํ ์ค๊ณ)
//getter, setter ์๋ต
public abstract class Robot {
private String name;
private MovingStrategy movingStrategy;
private AttackStrategy attackStrategy;
public Robot(String name) {
this.name = name;
}
public void move() {
movingStrategy.move();
}
public void attack() {
attackStrategy.attack();
}
}
Robotํด๋์ค๋ ๊ธฐ์กด์ ์์ ๊ด๊ณ์์ ์ง์ฝ๊ด๊ณ๋ก ๋ณ๊ฒฝ๋์๋ค. ๊ธฐ์กด์๋ ๋ณ๊ฒฝ ๋ฐ์ ์ ํ์ ํด๋์ค์ ์์ ์ด ๋ถ๊ฐํผ ํ์ง๋ง ์ง์ฝ๊ด๊ณ๋ก ๋ฐ๋์ด ๋ด๋ถ ์ฝ๋ ๋ณ๊ฒฝ์์ด ์ฝ๋๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ์ด ์คํํ ์ ์๊ฒ ๋์๋ค.
ํด๋ผ์ด์ธํธ ์ฝ๋
public class Client {
public static void main(String[] args) {
Robot taekwonV = new TaekwonV("TaekwonV");
Robot atom = new Atom("Atom");
taekwonV.setMovingStrategy(new WalkingStrategy());
taekwonV.setAttackStrategy(new MissileStrategy());
atom.setMovingStrategy(new FlyingStrategy());
atom.setAttackStrategy(new PunchStrategy());
System.out.println("My name is " + taekwonV.getName());
taekwonV.move();
taekwonV.attack();
System.out.println("My name is " + atom.getName());
atom.move();
atom.attack();
}
}
robot์ ํ์ ํด๋์ค๋ ์ด๋๋ฐฉ์์ด๋ ๊ณต๊ฒฉ๋ฐฉ์์ด ๋ฐ๋๋๋ผ๋ ํด๋์ค ๋ด๋ถ์ ์ง์ ์์ ์์ด ์ธ๋ถ์์ ์ฃผ์ ์ ํตํด ๋ฐฉ์์ ๋ฐ๊ฟ ์ ์๋ค.
'๐์ฝ์ ์ฑ ์ ๋ฆฌ > ๊ฐ์ฒด์งํฅ๋์์ธํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA ๊ฐ์ฒด ์งํฅ ๋์์ธ ํจํด] 4์ฅ : ๋์์ธ ํจํด (0) | 2021.05.28 |
---|---|
[JAVA ๊ฐ์ฒด ์งํฅ ๋์์ธ ํจํด] 3์ฅ : SOLID ์์น (0) | 2021.05.28 |
[JAVA ๊ฐ์ฒด์งํฅ ๋์์ธ ํจํด] 2์ฅ : ๊ฐ์ฒด์งํฅ์ ์๋ฆฌ (0) | 2021.05.20 |
[JAVA ๊ฐ์ฒด์งํฅ ๋์์ธ ํจํด] 1์ฅ : ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ๋ง (0) | 2021.05.19 |