1 2 3 4 5 6 7 8 9 10 11 12 | package kr.sys4u.TemplateMethod; public abstract class Worker { protected abstract void work(); public final void printRoutine() { System.out.println("출근!!"); work(); System.out.println("퇴근!!"); } } | cs |
<Nurse.java>
1 2 3 4 5 6 7 8 9 | package kr.sys4u.TemplateMethod; public class Nurse extends Worker{ @Override protected void work() { System.out.println("환자를 치료합니다."); } } | cs |
<Student.java>
1 2 3 4 5 6 7 8 9 | package kr.sys4u.TemplateMethod; public class Student extends Worker{ @Override protected void work() { System.out.println("공부합니다."); } } | cs |
<Main.java>
1 2 3 4 5 6 7 8 9 10 11 12 | package kr.sys4u.TemplateMethod; public class Main { public static void main(String[] args) { Worker nurse = new Nurse(); nurse.printRoutine(); System.out.println("====================="); Worker student = new Student(); student.printRoutine(); } } | cs |
- 왜 printRoutine() 에 final을 붙였을까?
=>final을 붙이게 되면 하위 클래스에서 Override를 할수없게 된다.
=>printRoutine() 경우 전체적인 흐름(변하지 않는)을 수행하는 구조를 맡는 메소드로서 모든 클래스에서는 공통적으로 사용되는
부분이며 또한 printRoutine() 변경이 되면 전체적인 흐름을 방해할수 있기 때문
- 장점
1) 코드중복을 줄일수 있다.
2) 자식객체의 역할을 줄임으로써 핵심로직에 집중할수 있다.
3) 자식 객체 확장에 용이함
- 단점
1) 추상메소드가 너무 많으면 관리가 힘들어진다.
2) 추상클래스 템플릿메소드에서 하위클래스 메소드를 호출(상위->하위)해야하기 때문에 혼선이 생길수 있다.
Anti-Pattern
=> 상속을 하는 패턴이기 때문에 Anti-Pattern이다. " 상속을 지양 " 하는것이 OOP에서 중요하기 때문에
=> why? 상속을 할수록 비대하게 커짐. SRP를 위배할수 있음. SRP를 지키면서 만들수 있지만 너무 많은 일을 하게 됨
(conposition over inheritence) => 상속보단 조합 => 인터페이스를 써라.
=> 비대하게 커지게 되면 메소드가 어디까지 재정의 되어있고 어떤 하위클래스가 가진것인지 한번에 알기 힘들다.
=> why?
=> 상속이 다형성을 막아버림,다형성 제약이 생김 ( 이 상속 계통으로만 변환이 된다 => 인터페이스를 사용하자 )
etc..)
스프링
convention over configuration : 설정보단 관습을 따라라
'프로그래밍 > 디자인 패턴' 카테고리의 다른 글
디자인패턴은 왜 비슷한것들이 많은가? (0) | 2019.01.17 |
---|---|
[디자인패턴] Chapter1. 스트래티지 패턴 (0) | 2018.09.15 |