
Head First Design Patterns 14. Compound Pattern
2022. 3. 25. 23:18
Design Patterns
컴파운드 패턴(Compound Pattern)의 정의 컴파운드 패턴(Compound Pattern)이란 하나의 디자인 문제를 해결하기 위해 여러 패턴을 함께 사용하는 것을 뜻합니다. MVC 패턴도 바로바로 컴파운드 패턴의 한 예시입니다. MVC 집중 탐구 Controller가 존재하는 이유 모델(Model)을 조작하는 임무를 뷰(View)에서 수행한다면, 뷰에서 두 가지 역할을 하게 되면서 코드가 복잡해지는 문제가 있습니다. 뷰를 모델에 너무 밀접하게 연관시켜야 한다는 문제가 있습니다. 이러한 경우, 재사용하기가 아주 힘들어집니다. 컨트롤러(Controller)를 사용하면 모델과 뷰의 결합을 끊어줄 수 있어서 나중에 확장하기가 용이합니다. MVC에 사용된 디자인 패턴 모델(Model) : 옵저버 패턴(O..

Head First Design Patterns 13. Proxy Pattern
2022. 3. 19. 23:26
Design Patterns
프록시 패턴(Proxy Pattern)의 정의 프록시 패턴(Proxy Pattern) - 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴 프록시 패턴에서 접근을 제어하는 활용은 아래와 같습니다. 원격 프록시(remote proxy) 프록시 패턴을 써서 원격 객체에 대한 접근을 제어할 수 있습니다. 다른 JVM에 들어있는 객체의 대변인에 해당하는 로컬 객체입니다. 가상 프록시(virtual proxy) 프록시 패턴을 써서 생성하기 힘든 자원에 대한 접근을 제어할 수 있습니다. 실제 객체 생성을 미루게 해 주는 기능을 제공하기도 합니다. 보호 프록시(protection proxy)를 써서 접근 권한이 필요한 자원에 대한 접근을 제어할 수 있습니다.

Head First Design Patterns 12. State Pattern
2022. 3. 18. 21:22
Design Patterns
스테이트 패턴(State Pattern) 예제 개선할 샘플 코드 reference code to refactor 위의 예제는 현재 상태에 따라서 수행하는 동작이 달라지는 Gumball Machine을 구현한 것입니다. 각 메소드는 아래와 같이 현재 상태에 따라서 수행하는 동작이 달라지게 됩니다. GumballMachine.java public void insertQuarter() { switch (state) { case SOLD_OUT: System.out.println("SOLD OUT"); break; case NO_QUARTER: state = HAS_QUARTER; System.out.println("Inserted quarter"); break; case HAS_QUARTER: System.o..

Head First Design Patterns 11. Composite Pattern
2022. 3. 13. 21:20
Design Patterns
컴포지트 패턴(Composite Pattern) 디자인 컴포지트 패턴(Composite Pattern)은 객체들을 트리 구조로 구성할 때 쓰는 디자인 패턴입니다. 우선, 객체는 트리 구조와 동일하게 1. Leaf 노드와 2. Leaf 노드가 아닌 Composite 노드가 있습니다. 이 두 객체는 상위 개념인 Component 클래스를 상속받고 재귀적인 구조를 구성합니다. 상위 클래스인 Component 클래스는 이 두 객체에서 구현해야하는 모든 함수를 포함하고 있습니다. Composite 클래스는 자식이 있는 구성요소의 행동을 정의하고 자식 구성요소를 저장하는 역할을 합니다. Leaf 클래스는 그 안에 들어있는 원소에 대한 행동을 정의합니다. 컴포지트 패턴(Composite Pattern) 예제 아래 다..

Head First Design Patterns 10. Iterator Pattern
2022. 3. 12. 22:39
Design Patterns
이터레이터 패턴(Iterator Pattern)은 언제 필요할까? code reference 두 개의 구성 객체에서 하나는 정보를 ArrayList 데이터 타입로 가지고 있고 하나는 정보를 Array 데이터 타입으로 가지고 있을 경우, 아래와 같이 각각 다른 loop 를 통해 탐색을 해야합니다. ArrayList - size() 함수 이용 Array - 배열에 들어있는 원소의 크기 변수 이용 Waitress.java public void printMenu() { ArrayList breakfastItems = pancakeHouseMenu.getMenuItems(); for (int i = 0; i < breakfastItems.size(); i++) { MenuItem menuItem = (MenuIt..

Head First Design Patterns 9. Adapter Pattern
2022. 3. 11. 20:47
Design Patterns
객체지향 어댑터(Adapter) 어댑터(Adapter)는 클라이언트로부터 요청을 받아서 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 합니다. 어댑터 패턴(Adapter Pattern) 예시 reference code 레퍼런스 코드를 확인해보면 클라이언트에서 Turkey 를 기존에 제공하는 클래스인 Duck 으로 변환시켜주기 위해 TurkeyAdapter 코드를 추가하였습니다. TurkeyAdapter.java public class TurkeyAdapter implements Duck { Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } @Override public voi..

Head First Design Patterns 8. Template Method Pattern
2022. 2. 27. 22:22
Design Patterns
템플릿 메소드 패턴(Template Method Pattern) 예제 code reference 템플릿 메소드(Template Method)에서는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다. 아래 예시를 살펴보면 CaffeineBeverage 클래스에서 알고리즘을 독점하고 있는 것(prepareRecipe)을 볼 수 있습니다. 그리고 이 알고리즘의 일부 구현만 서브 클래스에 의존합니다. 그래서 알고리즘은 한 군데에 있기 때문에 그 부분만 고치면 됩니다. CaffeineBeverage.java public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(..

Head First Design Patterns 7. Facade Pattern
2022. 2. 26. 09:37
Design Patterns
퍼사드 패턴(Facade Pattern)의 정의 퍼사드 패턴(Facade Pattern)은 하나 이상의 복잡한 인터페이스를 깔끔하면서도 말쑥한 퍼사드(겉모양, 외관 등을 뜻함)으로 덮어주는 패턴입니다. 일련의 복잡한 클래스들을 단순화하고 통합된 클래스를 제공합니다. Head First Design Patterns에서는 아래와 같이 퍼사드 패턴을 정의합니다. 퍼사드 패턴(Facade Pattern) 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있습니다. 최소 지식 원칙 Design Pattern 7. 최소 지식 원칙 - 정말 친한 친구하고만 얘기하라. 시스템을 디자인 할 때, 어떤 객체든 그 객체와..

Head First Design Patterns 6. Command Pattern
2022. 2. 25. 23:02
Design Patterns
커맨드 패턴(Command Pattern) 예시 커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구 사항을 캡슐화합니다. 아래 샘플 코드에서 SimpleRemoteControl 은 인보커(Invoker) 클래스, LightOnCommnad 클래스는 커맨드(Command) 클래스, Light 는 리시버(Receiver) 클래스, RemoteControlTest 는 클라이언트(Client) 클래스의 예시입니다. reference code SimpleRemoteControl.java (Invoker) SimpleRemoteControl 은 Command 객체를 들고 있습니다. 그리고 실제 Command 객체가 어떤 객체인지, 어떤 일을 하는지 상관없이 버튼이 눌리면 execute 함수를 호출합니다..

Head First Design Patterns 5. Singleton Pattern
2022. 2. 20. 23:18
Design Patterns
싱글톤 패턴(Singleton Pattern)의 용도 스레드 풀, 캐시, 대화상자, 사용자 설정 혹은 레지스트리를 처리하는 객체, 로그 기록용 객체, 디바이스 드라이버 등 객체 중에 하나만 있으면 되는 경우 사용합니다. 고전적인 싱글톤 패턴(Singleton Pattern) 고전적인 싱글톤 패턴 방식은 아래와 같습니다. 생성자는 private 으로 설정하고, 객체를 부를 때에는 따로 static 함수를 사용합니다. 인스턴스가 있을 경우에는 그대로 그 인스턴스를 반환하고, 인스턴스가 없을 경우에는 생성하여 인스턴스를 반환하변 됩니다. public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public s..

Head First Design Patterns 4. Factory Pattern
2022. 2. 19. 23:00
Design Patterns
흔히 말하는 팩토리 패턴(Factory Pattern)에는 팩토리 메소드 패턴(Factory Method Pattern)과 추상 팩토리 패턴(Abstract Factory Pattern) 두 가지 패턴이 있습니다. 이 패턴들에 대해 오늘 순서대로 알아보겠습니다. 팩토리 패턴(Factory Pattern)의 필요성 new를 사용하는 것은 구상 클래스의 인스턴스를 만드는 것입니다. 구상 클래스를 바탕으로 코딩을 하면 나중에 코드를 수정해야할 가능성이 높아지고, 유연성이 떨어지게 됩니다. 그 예가 아래와 같습니다. code reference 구상 클래스를 사용하면 아래처럼 조건에 따라 만들려고 하는 구상 클래스를 명시해줘야 합니다. 이는 뭔가 변경하거나 확장해야할 때 코드를 또 확인하고 추가해야한다는 뜻이죠...

Head First Design Patterns 3. Decorator Pattern
2022. 2. 13. 23:07
Design Patterns
OCP(Open-Closed Principal) Design Principal 5. 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다. 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있게 구조를 잡으면 새로운 기능을 아주 유연하게 추가할 수 있으면서도 강하고 견고한 디자인을 만들 수 있습니다. 다만, 무조건 OCP를 적용하는 것은 시간 낭비가 될 수도 있고, 쓸 데 없는 일일 수 있으니 유의하여야 합니다. 데코레이터 패턴(Decorator Pattern)의 정의 데코레이터 패턴은 객체를 다른 객체로 "장식"하는 것입니다. 데코레이터 패턴은 아래와 같이 정의됩니다. 데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터..