본문 바로가기

소프트웨어/디자인패턴

(16)
[소프트웨어/디자인패턴] 템플릿 메서드 패턴(Template Method Pattern) 템플릿 메서드 패턴은 구조적으로 동일한 기능들의 코드 중복의 최소화를 도와줍니다. Context 엘리베이터는 모터와 문 등으로 이루어져 있다. 기존의 엘리베이터의 모터가 HyundaiMotor이고 Door가 있을 때 아래와 같이 나타낼 수 있는데 HyundaiMotor은 Door을 가지고 있고 Door에 상태(DoorStatus)에 따라서 모터의 움직임이 달라진다. 모터 움직이고 있는 경우 명령을 무시한다. 문이 열려있을 경우 문을 닫는다. 모터를 움직인다. 모터의 상태를 바꾼다. 위와 같은 조건에 따라서 아래와 같이 구현할 수 있다. class HyundaiMotor { private Door door; private MotorStatus motorStatus; public HyundaiMotor(Do..
[소프트웨어/디자인패턴] 데커레이터 패턴(Decorator Pattern) 데커레이터 패턴은 추가기능 클래스들의 객체 조합을 통해서 클래스 폭발을 해소하는 방식이다. Context 지도 어플리케이션을 만들자고 해보자, 지도 어플리케이션은 기본적으로 도로를 보여주며 추가적인 기능으로 차선, 교통상황 교차로 등을 보여줄 수 있다. 일단 기본적인 기능인 도로와 차선정보 표시를 보여주는 것을 만들어보자. RoadDisplay이 기본적인 도로정보를 표시해주는 기능을 담당하는 클래스라면 RoadDisplayWithLane가 RoadDisplay를 상속받아 차선 정보 기능을 추가적으로 확장시킨다. class RoadDisplay { public void draw() { System.out.println("기본 도로 표시"); } } class RoadDisplayWithLane extend..
[소프트웨어] 디자인 패턴에 대해서 사실 디자인 패턴은 대략 1990년대 건축분야에서 먼저 시도한 내용이며 건축가 크리스토퍼 알렉산더는 아래와 같이 정의했다. 각 패턴은 우리 주변에서 자주 반복해서 발생하는 문제와 그 문제를 해결하는 핵심을 기술해 동일한 일을 두 번 다시 하지 않고 해결할 수 있도록 한다. 적절한 격언으로써 "Don't reinvent the wheel"는 말을 예로 들을 수 있는데 굳이 스스로 해결하지 말고 해당 상황에 대해 이미 널리알려진 적절한 패턴을 도입해서 구조적인 취약점을 해결하라는 뜻으로 받아들일 수 있다. 디자인 패턴의 요소 Context : 상황, 패턴이 적용될 수 있는 상황 Problem : 문제, 해결될 필요가 있는 디자인 이슈 Solution : 해결, 문제를 해결할 수 있는 설계, 구현 방법이나 언..
[소프트웨어/디자인패턴] 옵저버 패턴(Observer Pattern) observer 패턴은 통보 대상 클래스와 통보 하는 클래스 간의 의존성을 제거한다. Context 모니터링 툴이나 통계 툴은 원본데이터가 변할 때마다 항상 그래프나 그리드에 해당 데이터를 반영하여 관제자가 볼 수 있도록 한다. 이제부터 학생의 성적에 관한 모니터링 툴을 만들 것이다. 일반적으로 생각했을 때는 아래와 같이 ScoreRecord와 DataSheetView를 서로 의존하여 ScoreRecord의 addScore와 같은 점수 변경, 추가, 삭제에 대한 메서드라 호출될 때 DataSheetView의 객체에 변동되었다고 통보(update)해주면 된다. 먼저, DataSheetView클래스는 ScoreRecord 속성으로 가지고 있는데, 그냥 update(ScoreRecord:ScoreRecord)..
[소프트웨어/디자인패턴] 커맨드 패턴(Command Pattern) 커맨드 패턴은 명령을 추상화한 패턴이다. Context 보통 램프를 크고 켜는 버튼을 만든다고 생각한다면, 버튼 내에 램프 필드가 존재하고 이를 이용하는 Pressed라는 메서드를 구현함으로써 아래 다이어그램과 같이 구현할 수 있다. 이를 코드로 나타내면 비교적 간단하게 프로그래밍할 수 있다. class Lamp { public void turnOn() { System.out.println("Lamp On"); } } class Button { private Lamp theLamp; public Button (Lamp lamp) { theLamp = lamp; } public void pressed() { theLamp.turnOn(); } } Problem 변경에 대해 안전한가? (OCP를 준수하는가)..
[소프트웨어/디자인패턴] 스테이트 패턴(State Pattern) State Pattern 스테이트 패턴은 상태에 행위를 위임하는 패턴이다. Context 전등이 있다고 가정하자, 우리는 on버튼과 off버튼을 이용해서 끌 수 있고, 킬 수 있다. off상태에서 off버튼 눌러도 아무런 변화는 없다(반대의 경우도 마찮가지다) 이를 아래와 같이 상태 머신 다이어그램으로 나타낼 수 있다. 상태 머신 다이어그램은 별다른 코드레벨 설계가 아니라고 볼 수 있다. 그래서 우리는 보통 생각하는 것과 같이 if의 향현의 코드를 아래와 같이 만들 수 있다. 내부 또는 내부지만 공개한 enum을 통해 상태를 정의하고 Light클래스는 해당 STATE를 필드로 가지고 있음으로써 해당 객체의 상태를 정의했다.각각의 on_button_pushed(), off_button_pushed()를 보..
[소프트웨어/디자인패턴] 싱글톤 패턴(Singleton Pattern) 싱글톤 패턴은 한정된 자원을 효율적으로 쓸 수 있도록 만들어준다. Context 어떤 자원은 한정적인데 여러곳에서 또는 여러명이 사용해야하는 경우가 있다. 만약에 엘레베이터, 프린터, 정수기 등등이 될 수 있다. 이들은 필요할 때마다 생성하여 사용하기 어려운 사물들이다. 자 그럼 제한된 자원을 공유하여 사용해야하는데 이런경우 어떻게 해야할 수 있을까?방향 생성자는 외부에 공개하지 않는다. private static의 자기 자신의 인스턴스를 가진다. public static getInstance():SelfClass로 그 인스턴스가 null일 때는 생성해주고 아닌경우에는 그냥 해당 인스턴스를 반환한다. 위 방향을 모두 구현하면 아래 코드와 같다. class LimitedResource { private s..
[소프트웨어/디자인패턴] 스트레티지 패턴(Strategy Pattern) 스트레티지 패턴은 OCP를 지킬 수 있도록 도와준다. Context 만약에 Robot이란 추상클래스가 있고 Atom과 Marin이 이 추상클래스를 상속받아 각각의 공격방법과 이동 방법을 구현한다. 여기까지는 객체지향적인 설계라고 할 수 있는데, 자 그럼 이제부터 Atom과 Marin을 업그레이드 시켜보자. Problem 기능 확장의 문제점 Atom은 기존엔 걸을 수 밖에 없었다. 하지만 연구원들이 열심히 노력해서 걷기보다는 날 수 있도록 만들었다. 그렇다면 코드상 아래와 같아진다. class Atom extends Robot{ // written something.. void move() { // 이전코드 // System.out.println("I'm walking!"); // 수정코드 System.o..