변경이 발생했을 때, 변경해야될 부분이 적으면 단일 책임 원칙을 준수한 것.
클래스를 변경해야 하는 이유가 오직 하나여야 한다.
class GalaxySpec {
private String cpu;
private String memory;
private int battery;
private double weight;
}
class Galaxy {
private String serialNumber;
private GalaxySpec spec;
public Galaxy(String serialNumber, GalaxySpec spec) {
this.serialNumber = serialNumber;
this.spec = spec;
}
}
스펙만 관리하도록 객체를 나눔
class Phone {
private String serialNumber;
private PhoneSpec spec;
public Phone(String serialNumber, PhoneSpec spec) {
this.serialNumber = serialNumber;
this.spec = spec;
}
}
class PhoneSpec {
private String cpu;
private String memory;
private int battery;
private double weight;
}
class Galaxy extends Phone
class IPhone extends Phone
class 샤오미 extends Phone
class Sony extends Phone
상속을 통해 변경은 없이 확장만 수행
- 템플릿 메소드 패턴 : 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의 하는 패턴이다. 알고리즘이 단계별로 나누어 지거나, 같은 역할을 하는 메소드이지만 여러곳에서 다른형태로 사용이 필요한 경우 유용한 패턴이다. - GoF Design Patterns
스피커(부모 클래스) 기능 중 볼륨 업은 소리를 키우는 기능이다. 하만카돈 스피커(자식 클래스)의 볼륨업은 소리를 줄이면 안된다. 소리가 작게 커지더라도 소리를 키워야한다. → 그래야 믿고 쓸 수 있다.
public class SkyPhone implements Phone {
@Override
public void call(String phoneNumber) {
// ..
}
@Override
public void pay(String cardName) {
// ..
}
@Override
public void wirelessCharge() {
// 1. 가만히 냅눈다. - 극강 빌런
// 2. System.out.println("사용하지 않음"); - 그나마 양호
// 3. throw new NotSupporedException(); - 테스트코드에서 걸리는 케이스
}
}
변하기 쉬운 것 -> 구체적인 행동
변하기 어려운 것 -> 흐름이나 개념과 같은 추상적인 것