클래스를 설계할 때 참고할 수 있는 몇가지 원칙이 있음. 원칙을 따르지 않을 때 더 빨리 개발하기도 하지만 절약한 개발 시간보다 훨씬 많은 유지보수 시간이 필요할 지도 모른다.
reference: https://gmlwjd9405.github.io/2018/07/06/design-pattern.html23가지의 디자인 패턴이 존재한다. 각각의 디자인 패턴은 생성(Creational), 구조(Structural), 행위(Behavior
표현하고 싶은 부분은 display() 추상 메서드 => 나머지를 모두 지워도 됨.참고로 인터페이스 표시는 메서드 부분만 표시(어트리뷰트가 존재하지 않음).
Pet 참조변수로 Dog, Cat 인스턴스를 참조한다. <= 다형성상속받은 메서드는 자손 클래스에 표시하지 않음.하지만 display() 경우 메서드 오버라이딩을 한 것이므로 추상 메서드 표시가 아닌 것으로 자손 클래스에 표기.이러한 구조는 문제가 발생. 바로 못
특정한 계열의 알고리즘들을 정의하고각 알고리즘을 캡슐화하며이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.(source: https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5\_%ED%8C%A8%ED%84%B4)
All duck swim: swim() - code reuseBut they look different: /display()/ - push to implements, 특성상 강요의 의미. 자손 클래스에서의 구현을 강요. Inheritance: code reuse(재사용
디자인 패턴 구성NameIntentMotivationStructureConsequenceName: Strategy patternIntent: Define a family of algorithms, encapsulate each one, and make them inte
Observer pattern: 어떤 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 디자인 패턴
Type of static structure diagram클래스, 속성, 메서드 그리고 객체간의 관계를 보여준다.Represented as square box contains three components클래스 이름속성메서드 Prefix(Access privileges
Type of dynamic behavior diagramshows object interactions arranged in time sequenceAka 'event diagram' or 'event scenarios'1\. 독서 회원이 서가에 있는 책을 대출해 간다
Publisher 인터페이스는 옵저버(관찰자)를 등록/삭제하고, 무언가를 알리는 기능을 정의한다. Observer 인터페이스는 Publisher로 부터 새로운 정보를 받는 기능이 있다. Publisher의 notify() 메서드에서 자신의 옵저버들의 update()를
Observer pattern: 어떤 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 디자인 패턴Main 함수Subject 인터페이스Observer 인터페이스DisplayElement 인터페이스WeatherData 클래스여러 디스플레이 중 하나인 'Curr
Intro: '파일 계층구조', 클래스 다이어그램으로 표현Intro: '패키지', 클래스 다이어그램으로 표현객체의 결합을 통해 기능을 동적으로 유연하게 확장기본 기능에 추가할 수 있는 기능의 종류가 많은 경우 각 추가 기능을 Decorator 클래스로 정의. => De
본 글은 디자인 패턴 수업 내용과 강의자료 그리고 https://gdtbgl93.tistory.com/9 글을 참고하여 작성하였습니다. (교재)Intention: Attach additional responsibilities to an object dynami
주어진 문자열에 특수문자장식을 붙이는 프로그램을 작성하고자 한다.예를 들어 주어진 문자열이 “Young”이라고 할 때 장식을 붙이면 “young\*”이 되고 =장식을 붙이면 “=young=”이 된다. 이러한 특수문자 장식은 중첩되어 적용이 가능하다.Step 1:문자열을
데커레이터 패턴에서 객체들에 새로운 기능을 확장할 때 활용되는 매커니즘이 바로 컴포지션(composition)이다. 이 컴포지션은 두 가지 방식으로 나누어진다.1\. 동적 컴포지션참조를 주고받으며 런타임 과정에서 동적으로 무언가(기능)를 합성하게 한다. 이 방식은 유연
본 글은 디자인패턴 수업과 강의자료, 그리고 https://readystory.tistory.com/117 을 참고하며 작성하였습니다.Factory Pattern은 조금 더 구체적인 용어인 Factory Method Pattern으로 널리 알려져 있다. 이 팩
When you have code that makes use of lots of concrete calsses, you're looking for trouble because that code may have to be changed as new concrete cla
객체를 직접 생성하는 것이 아니라, 팩토리 메서드를 이용하여 간접적으로 객체를 생성하여 반환하는 방식. (객체를 대신 생성해주는 공장.) (장점)생성할 클래스를 미리 알지 못해도 팩토리 클래스가 객체 생성 담당.객체의 자료형이 하위클래스에 의해서 결정 -> 확장(ext
PizzaStore 디자인이 이제 슬슬 모양새를 갖춰가고 있다. 유연한 프레임워크(팩토리 메서드를 이용해)도 만들어졌고, 디자인 원칙도 충실하게 지키고 있다. 하지만 문제가 또 발생했다. 새로운 프레임워크가 도입된 이후로 몇몇 분점에서 자잘한 재료를 더 싼 재료로 바꿔
reference: "모던 C++ 디자인패턴" / 드미트리 네스터룩직교 좌표계의 좌표 정보를 저장할 구조체이다. 여기에 만약 극좌표계로 좌표값을 저장하는 생성자가 오버로딩된다면 다음과 같다.문제는 이런 식으로 매개변수 형태가 같은 생성자를 추가하면 컴파일 에러가 뜬다.
reference: "모던 C++ 디자인패턴" / 디미트리 네스터룩객체를 생성하는 팩토리 메서드를 클래스 내부에 static으로 선언하는 것이 아닌 별도의 클래스에 몰아넣을 수도 있다. 이러한 클래스를 팩토리 클래스라 한다. 이러한 팰토리 클래스를 만들기 위해 먼저 앞
팩토리 메서드나 내부 팩토리 방식은 객체 한 종류를 생성하는 경우에 유용하다. 만약 여러 종류의 연관된 객체들을 생성해야 할 경우는 떻게 해야할까? 바로 추상 팩토리 방식을 사용하면 된다. 뜨거운 음료를 판매하는 카페가 있고, 일단 종류가 커피와 차가 있다고 가정한다.
참고: https://gmlwjd9405.github.io/2018/07/06/singleton-pattern.html전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴팩토리 패턴과 같이 생성 패
해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴에 접근할 수 있도록 하기 위한 패턴. 클래스에서 자신의 단 하나뿐인 인스턴스를 관리하도록 만들면 됨. 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하도록 해야 한다. 인스턴스가 필요하면 반드
reference: "모던 C++ 디자인패턴" / 디미트리 네스터룩메모리에 DB를 로드하고 읽기 전용 인터페이스를 제공하는 경우 싱글톤 패턴을 활용하기 딱 좋은 상황이다. 동일한 데이터를 여러 번 로드하여 메모리를 낭비할 필요가 없기 때문이다. 위와 같이 단순히 객체를
한 차원 더 높은 단계의 캡슐화 => 메소드 호출 캡술화!메서드 호출을 캡슐화하면 계산 과정의 각 부분들을 결정화시킬 수 있기에, 계산하는 코드를 호출한 객체에서는 어떤 식으로 일을 처리해야 하는지에 대해 전혀 신경쓰지 않아도 된다. 나아가 그냥 결정화된 메서드를 호출
커멘드 패턴: 커멘드 패컨을 이용하면 요구 사항을 객체로 캡슐화(커멘드 객체)할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수 있다. 또한 요청 내역 큐에 저장하거나 로그로 기록할 수도 있으며, 작업 취소 기능도 지원 가능하다. 일련의 행동을 특
커멘드에서 작업 취소 기능을 지원하려면 execute() 메서드와 비슷한 undo() 메서드가 있어야 한다. execute() 메서드에서 했던 것과 정반대의 작업을 처리하면 된다. LightOnCommand 클래스에 undo 메서드 구현LightOffCommand 클래
객체지향 어댑터도 결국 일상 생활에서 쓰이는 어댑터와 똑같은 역할을 한다. 어떤 인터페이스를 클라이언트에서 요구하는 형태의 인터페이스에 적응시켜주는 역할을 한다. 어댑터는 클라이언트로부터 요청을 받아서 새로운 업체에서 제공하는 클래스(vendor class)에서 받아들
어댑터 패턴: 어떤 클래스의 인터페이스를 클라이언트에서 원하는 인터페이스로 변환하는 방법. 호환성이 없는 인터페이스를 가지고 있는 객체를 올바른 인터페이스로 구현하는 객체로 감싸서 어댑터 패턴 구현퍼사드 패턴: 조금 다른 이유로 인터페이스변경. 인터페이스를 단순화시키기
최소 지식 원칙을 따르면, 객체 사이의 상호작용은 될 수 있으면 아주 가까운 "친구" 사이에서만 허용하는 것이 좋다. 디자인 원칙: 최소 지식 원칙 - 정말 친한 친구하고만 얘기하라여러 객체하고 인연을 맺는 것을 피할 수 있는 방법. 어떤 메서드에서든지 다음 네 종류의
템플릿 메서드 패턴에서는 메서드에서 알고리즘의 골격(템플릿)을 정의한다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다. 템플릿 메서드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브 클래스에서 특정 단계를 재정의할 수 있다. 다시 말해 이 패턴은
참고: http://astrod.github.io/design_pattern/2018/11/20/Head-First-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A9%94%EC%86%8C%EB%93%9C-%ED%8C%A8%ED%84%B4/ 후크(Hook)
일련의 디자인 패턴들을 함께 사용하여 다양한 디자인 문제를 해결하는 것을 컴파운드 패턴이라고 부른다. 대표적인 컴파운드 패턴 중 하나가 바로 MVC(Model-View-Controller)이다.MP3 재생 소프트웨어(ex, 아이튠즈)를 예로 MVC 모델을 소개하자면 다
웹이 퍼진지 얼마 되지 않아서 여러 개발자들이 MVC를 브라우저/서버 모델에 맞게 변형시켜 사용하였다. 그 중 "모델 2"가 있다.source: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blo