독서 기록/디자인패턴12 [디자인패턴] 헤드퍼스트 디자인패턴 Chap.10 (Feat. 상태 패턴) 패턴이 나오게 된 문제 상황 각 상태에 따라 행동을 다르게 하고 싶은 경우 이를 상태 변수를 통해 해결하고자 함 => 우리가 정의하는 행동마다 어떤 상태인지를 구별하고(조건문) 이에 따라 어떤 작업을 수행할지 정의해야 함 public class GumballMachine { // 상태 변수로 표현 final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; final static int HAS_QUARTER = 2; final static int SOLD = 3; int state = SOLD_OUT; int count = 0; public GumballMachine(int count) { this.count = count; if (count > 0).. 독서 기록/디자인패턴 2022. 11. 1. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.3 (Feat. 데코레이터 패턴) 패턴이 나오게 된 문제 상황 예를 들어 카페에서 판매하는 음료를 표현하고자 할 때, 커피1, 커피2, 커피3, 커피4 이렇게 종류가 있고, 들어갈 추가 요소가 우유, 두유, 모카, 휘핑크림 등이 있다고 하였을 때 위에 말한 요소들의 조합을 모두 서브 클래스로 만든다면 4*2^4 = 64개의 서브 클래스가 생길 것이다. 만약 우유나 두유 등 추가 요소를 한번만 넣거나 마는 것이 아닌 2번 이상 넣을 수 있다고 가정하면 더욱 경우의 수가 늘어날 것이다. Adding Boolean Variables 로 해결한 경우 앞서 말한 예시에서의 추가 요소에 대한 boolean 변수를 만들어 해결하는 방식이다 이러한 경우 음료 클래스에서의 cost() 구현하고 하위 클래스는 cost()를 오버라이드하여 사용한다. => .. 독서 기록/디자인패턴 2022. 11. 1. [디자인 패턴] Composite Pattern Composite Pattern의 특징 트리와 같은 계층적인 정보에서 하위에 정보가 없는 리프노드, 자식이 있는 논 리프노드 가 있을 때, 이런 서로 다른 노드를 같은 인터페이스를 통하여 일관된 방식으로 프로그래밍할 수 있게 함 public class MenuItem extends MenuComponent { String name; String description; boolean vegetarian; double price; public MenuItem(String name, String description, boolean vegetarian, double price) { ... } public String getName() { return name; } public String getDescript.. 독서 기록/디자인패턴 2022. 10. 24. [디자인패턴] Iterator 패턴 Iterator 패턴의 목적 aggregate object의 내부 구현이나 구조를 보여주지 않으면서 aggregate object의 요소들에 접근할 수 있게 하는 것 aggregate object란 다른 object들을 모아두기 위한 객체 == (container, collection), ex) LinkedList, Hash Table... Iterator 패턴을 사용하지 않는 경우 for(int i=0;i< breakfastItems.size();i++){ MenuItem menuItem = (menuItem) breakfastItems.get(i); } for(int i=0;i< lunchItems.length;i++){ MenuItem menuItem = lunchItems[i]; } Iterato.. 독서 기록/디자인패턴 2022. 10. 24. [디자인 패턴] SOLID 원칙 The Single-Responsibility Principle (SRP) The Open-Closed Principle (OCP) The Liskov Substitution Principle (LSP) The Interface Segregation Principle (ISP) The Dependency Inversion Principle (DIP) The Single-Responsibility Principle (SRP) 클래스는 변경될 단 하나의 이유가 있어야 함 하나의 이유는 책임에서 비롯되기에 결국 단 하나의 책임을 지어야 한다 라는 의미 클래스가 지는 책임이란 의무 혹은 계약이다 클래스가 지는 책임이 많아질수록 자주 변경될 것이고 클래스가 자주 변경될수록 버그를 야기시키고 다른 이들에게 영향을 .. 독서 기록/디자인패턴 2022. 10. 18. [디자인 패턴] 중재자 패턴 vs 옵저버 패턴 중재자 패턴(Mediate Pattern)이란? 중재자 패턴(Mediate Pattern)은 서로 상호작용하는 객체들을 느슨한 결합(Loose coupling)을 통해 상호작용하는 작업을 캡슐화하는 것 장점 시스템과 객체를 분리함으로써 재사용성 향상 제어 로직을 한 군데로 분리했기에 관리하기 쉬움 객체들 사이에 오가는 메세지 줄이고 단순화할 수 있음 단점 중재자 객체가 너무 복잡해질 수 있음 서로 연관된 GUI 구성 요소를 관리하는데 많이 사용됨 vs Observer Pattern 중재자 패턴은 객체간의 상호작용을 한군데에 모음, 반대로 옵저버 패턴은 분리시킨다 중재자 객체를 재사용하기 어려움, 반대로 옵저버랑 주제는 재사용하기 쉬움 상호작용의 흐름 이해하기 쉬움, 반면 옵저버 패턴은 흐름 알기 어려움 독서 기록/디자인패턴 2022. 10. 17. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.5 (Feat. 싱글톤 패턴) 인스턴스 1개만 있어도 되는 객체가 많음 예를들어 스레드 풀, 캐시, 대화상자, 디바이스 드라이버 등등 이런 경우 오히려 2개 이상이면 오작동, 일관성이 깨짐 혹은 자원 낭비 등의 문제가 발생할 수 있음 싱글톤 패턴: 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공한다. 즉, 객체 인스턴스를 전역 변수처럼 어디서든 엑세스할 수 있게 함 또한 사용하지 않으면 자원이 낭비되는 전역 변수의 단점을 감수하지 않는다. 게으른 인스턴스 생성을 통해 필요할 때 인스턴스 생성하여 자원 낭비 막음 싱글톤 패턴을 제대로 구현하면 new를 써서 만들면 안됨 public class Singleton{ private static Singleton uniqueInstance; private Singleton(.. 독서 기록/디자인패턴 2022. 10. 17. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.7 (Feat.어댑터, 퍼사드 패턴) 어댑터 패턴(Adapter Pattern) 기존의 시스템과 연결된 시스템의 클래스가 서로 다르다면 중간에서 이를 변환해줄 어댑터가 필요함 public class TurkeyAdapter implements Duck{ Turkey turkey; public TurkeyAdapter(Turkey turkey){ this.turkey = turkey; } public void quack(){ turkey.gobble(); } public void fly(){ turkey.fly(); } } 클라이언트(Turkey)를 타깃 인터페이스(Duck)로 변환해주는 어댑터 클래스이다. public static void main(String[] args){ Turkey turkey = new Turkey(); Duck t.. 독서 기록/디자인패턴 2022. 10. 10. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.4 (Feat.팩토리) new를 사용하지 않을 수는 없음 디자인 원칙 OCP(Open-Closed Principle): 클래스는 확장에는 열려있어야 하지만 변경에는 닫혀 있어야 한다. 인터페이스 기반이면 어떤 클래스든 인터페이스를 구현하면 사용할 수 있음 (다형성) 구상 클래스를 사용하면 구상 클래스가 추가될 때마다 코드 수정 필요 => 변경에 닫혀있게 됨 => 새로운 구상 형식을 써서 확장할 때는 다시 변경에 열릴 수 있게 하자 Phone getPhone(String model){ Phone phone; // 폰 종류가 늘어날 때마다 코드가 바뀌어야 하는 부분 if(model.equals("galaxy s10"){ phone = new GalaxyS10(); }else if(model.equals("iphone 14"){ p.. 독서 기록/디자인패턴 2022. 10. 10. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.6 (Feat.커맨드 패턴) 커맨드 패턴이란 request를 객체로 캡슐화하는 것이다. 예를 들어 형광등의 turnOff(), turnOn() 메소드가 있었다고 가정할 때, LightOffCommand, LightONCommand 같은 객체 형식으로 캡슐화하는 것이다. 이로서 이러한 request를 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있습니다. 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 그 객체(B)를 참조하고 있어야 하는 의존성이 발생합니다. 그러나 커맨드 패턴을 적용하면 의존성을 제거할 수 있습니다. 위의 예시에서 이어가면 리모콘 객체에서 형광등 객체의 turnOff(), turnOn() 메소드를 사용하면 리모콘 객체와 형광등 객체 사이의 의존성이 발생한다는 것이다. 또한 기능이 수정되거.. 독서 기록/디자인패턴 2022. 9. 28. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.2 (Feat.옵저버 패턴) public class WeatherData{ // 현재 기상 상황 갱신하는 메서드 public void measurementsChanged(){ // 최신값 불러옴 float temp = getTemperature(); float humidity = getHumidity(); float pressure = getPressure(); // 변화한 값 각 디스플레이에 갱신 display1.update(temp,humidity, pressure); display2.update(temp,humidity, pressure); display3.update(temp,humidity, pressure); } } 위의 코드에는 아래 같은 문제가 발생 인터페이스가 아닌 구체적인 구현을 바탕으로 함 새로운 디스플레이 생기.. 독서 기록/디자인패턴 2022. 9. 23. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.1 상속만 사용한 경우 생길 수 있는 문제 서브 클래스에서 코드 중복 실행 시에 특징 바꾸기 어려움 모든 클래스의 동작 알기 어려움 슈퍼 클래스에서 코드 변경시 원치 않은 서브 클래스에도 영향 준다. => 인터페이스의 등장 다만 인터페이스를 사용하면 인터페이스를 상속하는 모든 서브 클래스들에서 코드를 구현해야함. ex) A,B,C,D,E,F 6개의 서브 클래스가 있을 때 x 라는 인터페이스를 만들어 동작을 구현했는데 이를 동일하게 수정하고 싶으면, A~F까지 모든 서브 클래스의 내용을 수정해야함. 즉 코드 재사용이 되지 않는 문제점이 있다는 것, 한가지 동작을 바꿀 때 마다 그 동작이 정의되어 있는 서브 클래스들을 전부 찾아서 코드를 고쳐야 하고, 그 과정에서 버그가 생길 수 있음 소프트웨어 개발 불변의 진.. 독서 기록/디자인패턴 2022. 9. 23. 이전 1 다음 반응형