🔎느슨한 결합의 필요성을 mario 게임과 supercontra 게임 예시를 통해 알아보자
package com.in28minutes.learnspringframework.game;
public class MarioGame {
public void up() {
System.out.println("Jump");
}
public void down() {
System.out.println("Go into a hole");
}
public void left() {
System.out.println("Go back");
}
public void right() {
System.out.println("Accelerate");
}
}
package com.in28minutes.learnspringframework.game;
public class SuperContraGame {
public void up() {
System.out.println("up");
}
public void down() {
System.out.println("Sit down");
}
public void left() {
System.out.println("Go back");
}
public void right() {
System.out.println("Shoot a bullet");
}
}
package com.in28minutes.learnspringframework.game;
public class GameRunner {
//MarioGame game;
SuperContraGame game;
public GameRunner(SuperContraGame game
//MarioGame game
) {
this.game = game;
}
public void run() {
System.out.println("Running game: " + game);
//System.out 보다 로깅 프레임워크를 사용하는것이 좋다
game.up();
game.down();
game.left();
game.right();
}
}
public class AppGamingBagic {
public static void main(String[] args) {
//var marioGame = new MarioGame();
//var gameRunner = new GameRunner(marioGame);
var superContraGame = new SuperContraGame();
var gameRunner = new GameRunner(superContraGame);
gameRunner.run();
}
}
위의 두 게임은 동작방법이 비슷하지만 강한 결합으로 한가지 게임을 실행하면 나머지 게임을 주석 처리 해줘야하는 비효율적인 방식으로 동작 되고 있다( 느슨한 결합의 필요성)
문제점 : GameRunner 클래스가 특정 게임과 강하게 결합되어 있다(마리오게임에서 수퍼콘트라 게임으로 바꾸는것이 쉽지 않음)
예시)