DesignPattern 왜 알아야 할까?
프로그래밍을 잘 한다는 것은 무엇일까?
우선 만들고자 하는 기능을 만들 수 있어야 한다.
이건 너무 당연한 이야기이고
버그가 없어야 한다.
유지보수에 용이하게 변경과 확장에 유연해야 한다.
코드가 깔끔해야 한다.
성능이 좋아야 한다.
사람마다의 기준이 다를 것이고 추구하는 방향성이 다를 것이다.
그 많은 기준 중에 프로젝트를 구조적으로 잘 만들고 싶은 욕심이 있다면
공부해야하는 것이 디자인 패턴이라고 생각한다.
어떻게 하면 더 유연성이 있는 코드를 만들 수 있을까 고민하고 정의한 것을
패턴으로 만든 것이다.
머리가 너무 좋아서 추상클래스, 인터페이스, 상속, 포함 관계로
상황에 맞는 유연성 있는 좋은 코드를 만들 수 있다면 공부할 필요가 없다.
하지만 그렇지 않다면 상황에 맞는 패턴들을 공부하고 그 상황이 나왔을 때
사용함으로 더 좋은 코드를 만들 수 있다.
더 나아가 기존의 패턴에서 발전시킨 자신만의 패턴을 만들 수도 있을 것이다.
이미 알게모르게 많이 사용하는 패턴이라 이해하기 쉬울 수도 있을 것이고
그렇지 않은 경우에 와닿지 않는 패턴들도 있을 것이다
해당 디자인 패턴이 어떤 상황에서 필요한지 정리하고
꾸준히 그 패턴을 인지하고 있다면 언젠가 도움이 될 것이다.
Head First Desgin Pattern을 가지고 정리하려 한다.
Github에 패턴별로 branch를 나누고
Commit을 통해 어떻게 무엇을 개선하기 위해 발전했는지 과정을 보여주려고 한다.
코드를 돌려보며 확인하면 좋을 것 같다.
Strategy
알고리즘군을 정의하고 각각을 캡슐화하여 바꿔 쓸 수 있게 만든다. 스트래티지 패턴을 이용하면 알고리즘을 활용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.
Observer
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의
Decorator
객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확정할 수 있는 방법을 제공한다.
Factory
Factory
객체 생성하는 부분을 캡슐화하여 사용한다.
Factory Method
객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다.
Abstract Factory
인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스로 지정하지 않고도 생성할 수 있습니다.
Singleton
해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴
Command
요구 사항을 객체로 캡슐화할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다. 또한 요청 내역을 큐에 저장하거나 로그를 기록할 수도 있으며, 작업취소 기능도 지원 가능
Adapter
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
Facade
서브시스템에 있는 일련의 인터페이스에 대한 통합 인터페이스를 제공한다.
Template Method
메소드에서 알고리즘의 골격을 정의한다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있다.
Iterator
컬랙션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해 주는 방법을 제공해 준다.
EX) ArrayList, HashSet
Composite
객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다.
EX) Android의 View와 ViewGroup
Compound
객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
Proxy
어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴
디자인 패턴의 공통점은 변하지 않는 본질을 추상화하는 것