디자인 패턴의 중요성
프로그래밍 중 자주 발생하는 문제를 이미 누군가 좋은 해답으로 해결한 것
그것을 우리는 배워서 재사용하는 것이다.
디자인 패턴은 코드가 아닌 경험을 재사용하는 것이다.
디자인 원칙
애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다.(캡슐화)
달라지는 부분을 캡슐화하면 향후 다시 변경 시 나머지 안 달라지는 부분에 대한 영향도가 감소한다.
디자인 원칙
구현보다는 인터페이스에 맞춰서 프로그래밍한다.(다형성)
구현부가 존재하는 구체적인 클래스에 맞춰 프로그래밍하면 유연하지 못하다.
디자인 원칙
상속보다는 구성을 활용한다
자바는 단일 단일 상속만 지원한다. 따라서 더욱 적극적으로 구성을 활용하는 것이 좋다.
전략패턴(Strategy Pattern)
알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해준다.
알고리즘은 일련의 행동을 정의해둔 행동이다
public interface Movable {
void move();
}
public class Fly implements Movable{
@Override
public void move() {
System.out.println("날아갑니다...");
}
}
public class Riding implements Movable{
@Override
public void move() {
System.out.println("말타고 갑니다...");
}
}
public class Walk implements Movable{
@Override
public void move() {
System.out.println("걸어가기...");
}
}
public interface Weapon {
void attack();
}
public class BowWeapon implements Weapon{
@Override
public void attack() {
System.out.println("화살 쏘기!");
}
}
public class SpearWeapon implements Weapon{
@Override
public void attack() {
System.out.println("찌르기!");
}
}
public class SwordWeapon implements Weapon{
@Override
public void attack() {
System.out.println("베기!");
}
}
public abstract class Character {
String type;
//상속보단 일반적으로 구성과 위임이 더 유연하다(특히 자바는 단일 상속만 되므로)
Movable movable;
Weapon weapon;
public void setMovable(Movable movable) {
this.movable = movable;
}
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void attack() {
weapon.attack();
}
public void move() {
movable.move();
}
}
public class Angel extends Character{
public Angel() {
super.type = "천사";
}
@Override
public void attack() {
System.out.print("신성한 ");
super.attack();
}
}
public class Devil extends Character{
public Devil() {
super.type = "악마";
}
@Override
public void attack() {
System.out.print("타락한 ");
super.attack();
}
}
public class Ex {
public static void main(String[] args) {
//인터페이스에 맞춰서 프로그래밍 한다.
Character angel = new Angel();
Character devil = new Devil();
//전략 객체
//인터페이스에 맞춰서 프로그래밍 한다.
Movable fly = new Fly();
Movable riding = new Riding();
Movable walk = new Walk();
Weapon sword = new SwordWeapon();
Weapon spear = new SpearWeapon();
Weapon bow = new BowWeapon();
//실세 런타임 환경이라면 버튼이던 이벤트로 설정자 주입으로 객체 행동을 마음것 바꿀 수 있다.
angel.setMovable(fly);
angel.setWeapon(sword);
behavior(angel);
angel.setMovable(riding);
angel.setWeapon(spear);
behavior(angel);
angel.setMovable(walk);
angel.setWeapon(bow);
behavior(angel);
//람다식을 사용하면 전략 객체를 일급함수처럼(변수처럼) 다룰 수 있다.
devil.setMovable(()->System.out.println("뛰기!"));
devil.setWeapon(()->System.out.println("침뱉기!"));
behavior(devil);
}
static void behavior(Character character) {
character.move();
character.attack();
}
}
날아갑니다...
신성한 베기!
말타고 갑니다...
신성한 찌르기!
걸어가기...
신성한 화살 쏘기!
뛰기!
타락한 침뱉기!
패턴과 전문 용어
서로 알고 있는 패턴은 막강하다. 불필요한 설명이 필요없이 짧은 대화로 모든 의사소통된다.
예시, 우리는 여기 부분을 전략 패턴으로 설계했습니다.
속뜻, 자주 변경되는 부분을 캡슐화하여 쉽게 확장하고 런타임 환경에서 객체 행동을 자유롭게 변경할 수 있게 설계했다.
핵심 정리
패턴의 밑바탕에는 객체지향 기초(추상화, 캡슐화, 다형성, 상속)가 있다.
프로그램 생애주기를 보면 개발보다 유지보수가 훨씬 더 많은 비중을 차지한다. 따라서 재사용성, 확장성, 관리 용이성을 갖추는 것이 중요하다.
패턴은 검증받은 객체지향 경험이다.
대부분 패턴과 원칙은 변경에 관련된 것이다.
변경 가능성 있는 부분은 캡슐화해야 한다.
'IT책, 강의 > 헤드 퍼스트 디자인 패턴' 카테고리의 다른 글
CHAPTER 06 호출 캡슐화하기 커맨드 패턴 (0) | 2023.05.24 |
---|---|
CHAPTER 05 하나뿐인 특별한 객체 만들기 (싱글턴 패턴) (0) | 2023.05.21 |
CHAPTER 04 객체지향 빵 굽기 팩토리 패턴 (0) | 2023.05.19 |
CHAPTER 03 객체 꾸미기 데코레이터 패턴 (1) | 2023.05.17 |
CHAPTER 02 객체들에게 연락 돌리기 옵저버 패턴 (0) | 2023.05.15 |