전략패턴은 구체적인 것을 추상화해서 의존하는 기법
[Doorman이 고양이나 쥐를 만나면 쫓아내는 동작을 하도록 구현하기]
1. 잘못된 코드
문지기(Doorman)가 고양이(Cat)에 의존하기 때문에, 쥐(Mouse)로 변경하면 기존 코드를 수정해야 함
⇒ OCP 위배
package ch01;
// 쥐 Object
public class Mouse {
private String name = "쥐";
// private 변수라 접근 불가능해서
// 갖다쓰려면 getter 이용
public String getName() {
return name;
}
}
package ch01;
public class Cat {
private String name = "고양이";
// private 변수라 접근 불가능해서
// 갖다쓰려면 getter 이용
public String getName() {
return name;
}
}
package ch01;
// srp (Single Responsibility Principle)
// 하나의 클래스는 하나의 책임을 가지는게 좋다 (의무가 아니라 권장)
public class Doorman {
// 이 클래스의 책임
public void 쫓아내(Cat cat) {
System.out.println(cat.getName() + "쫓아내");
}
}
package ch01;
public class App {
public static void main(String[] args) {
Doorman doorman = new Doorman();
Cat cat = new Cat();
doorman.쫓아내(cat);
}
}2. 좋은 코드
Animal 클래스를 만들고, 추상화해서 해결
srp (Single Responsibility Principle)
- 하나의 클래스는 하나의 책임을 가지는게 좋다 (의무가 아니라 권장)
DIP (Dependency Inversion Principle)
- 의존성 역전 원칙
- 구체적인 것(Object)에 의존하지말고 추상적인것(Animal)에 의존하라
package ch01;
// 추상 클래스 => 상속 가능
public abstract class Animal {
public abstract String getName();
}
package ch01;
// 쥐 Object
// Animal 상속
public class Mouse extends Animal{
private String name = "쥐";
// 부모와의 동일 메소드 오버라이드
public String getName() {
return name;
}
}
package ch01;
// 고양이 Object
// Animal 상속
public class Cat extends Animal {
private String name = "고양이";
// 부모와의 동일 메소드 오버라이드
public String getName() {
return name;
}
}
package ch01;
// srp (Single Responsibility Principle)
// 하나의 클래스는 하나의 책임을 가지는게 좋다 (의무가 아니라 권장)
public class Doorman {
// DIP (Dependency Inversion Principle, 의존성 역전 원칙)
// 구체적인것(Mouse, Cat)에 의존하지말고 추상적인것(Animal)에 의존하라
// 이 클래스의 책임
public void 쫓아내(Animal animal) {
System.out.println(animal.getName() + " 쫓아내");
}
}
package ch01;
public class App {
public static void main(String[] args) {
Doorman doorman = new Doorman();
Animal cat = new Cat();
Animal mouse = new Mouse();
doorman.쫓아내(cat);
doorman.쫓아내(mouse);
}
}Share article