본문 바로가기

Domain/디자인패턴

(12)
[디자인패턴] 컴포지트 패턴(Composite Pattern) 컴포지트 패턴(Composite Pattern) 컴포지트 패턴이란 객체들의 관계를 트리 구조로 구성하여 전체-부분의 관계 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일한 인터페이스로 다룰 수 있다. 말이 어렵지만 대표적인 예시를 들면 디렉토리, 파일 구조와 같다. 디렉토리는 '복합 객체'이며 파일은 '단일 객체'이다. 사용자인 OS 유저는 디렉토리, 파일에 대해 삭제/이름 바꾸기 등의 작업을 동일한 인터페이스로 수행할 수 있다. Component: 구체적인 부분 Leaf: 부분 클래스(단일 객체)로 Composite의 일부가 될 수 있다. Composite: 복합 객체로 복수 개의 Component를 가질 수 있다. 즉, Component를 상속받아 구현한 Leaf와 Composi..
[디자인패턴] 널 오브젝트 패턴(Null Object Pattern) 널 오브젝트 패턴(Null Object Pattern) 자바에서 흔히 마주칠 수 있는 에러가 NullPointerException이다. 이를 방지하기 위해 if(object!=null) 등의 코드를 활용하게 된다. 특정 객체가 존재하지 않는다는 것을 null이아닌 Null Object를 반환하여 NullPointerException을 방지하는 기법이 널 오브젝트 패턴이다. 단점으로는 잘못 사용할 경우 예외나 에러를 발견하기 어려울 수 있다. 예제 금액을 지불하는 날짜가 정해져있는 신용카드 고객들이 있다. 널 오브젝트 패턴 활용 전 Customer c = DB.getCustomer("Bob"); if (c != null && c.isTimeToPay(today)) { c.pay(); } 널 오브젝트 패턴 ..
[디자인패턴] 미디에이터 패턴(Mediator Pattern) 미디에이터 패턴(Mediator Pattern) 미디에이터 패턴은 객체들 간의 상호작용 행위를 정리하여 따로 모아놓은 중재자(미디에이터) 객체를 따로 두어 관리하는 디자인 패턴이다. 객체 간의 직접적인 소통보다 중재자를 통해 소통하게 된다. 객체 간의 의존성을 줄여 결합도를 감소시킨다는 장점이 있다. 잘못 사용할 경우 중재자 객체에 모든 권한이 집중되어 크고 복잡해진다. MediatorBase: Colleague 객체 간의 상호작용을 위한 인터페이스 ConcreteMediator: MediatorBase 인터페이스를 실제 구현하여 객체 간의 상호작용을 돕는 클래스 ColleagueBase: Colleague의 기본 인터페이스 ConcreteColleague: Colleague 인터페이스를 구현한 클래스로..
[디자인패턴] 데코레이터 패턴(Decorator Pattern) 데코레이터 패턴(Decorator Pattern) 객체에 동적으로 새로운 기능을 추가하려고 할 때 사용한다. 이 과정에서 객체의 타입과 호출하는 메소드는 그대로 유지한다. 또한, 상속을 통해 하위 클래스를 만드는 방법이 비효율적인 상황에서 사용할 수 있다. 예제. 고전 전투기 게임 위와 같은 전투기 게임에서 아이템을 먹을 때 마다 새로운 무기가 추가되는 기능이 존재한다. 기본 구성 interface Fighter{ fun attack() } open class F22Fighter:Fighter{ override fun attack(){ print("발사") } } 데코레이터 패턴 위의 F22Fighter 전투에서 아이템을 먹을 때 마다 추가될 기능을 구현한다. interface FighterDecorat..
[디자인패턴] 프록시 패턴(Proxy Pattern) 프록시 패턴(Proxy Pattern) 프록시 패턴은 어떤 다른 객체로의 접근하는 것을 제어하기 위해 그 객체의 대리자의 역할을 제공하는 패턴을 의미한다. 프록시 패턴은 다음과 같은 경우에 주로 사용된다. 한 객체가 너무 일이 많아 대리인 객체가 일부 일을 처리해야할 때 한 객체를 은닉하고 대리인 객체를 앞으로 먼저 보여야할 때 (Placeholder의 역할) 사용 여부가 불확실 한 객체를 생성하는 것을 방지하고 실제 필요할 때 생성할 수 있게끔 할 때 --> 영상 썸네일 매우 간단한 구현 예시 interface Service{ fun doSomething() } open class MainService: Service{ override fun doSomething(){ print("I'm real") ..
[디자인패턴] 퍼사드 패턴(Facade Pattern) 퍼사드 패턴(Facade Pattern) 퍼사드 패턴은 가장 객체지향의 기본적인 패턴이다. 복잡한 코드를 뒤에 숨기고 간략화 된 인터페이스를 제공하는 패턴이다. 여러 클래스를 퍼서드 클래스 안에서 클래스들을 초기화해주고 특정 작업을 수행하면 된다. 예제 예를 들어, 사용자의 위치 정보를 얻어 해당 위치에 필요한 정보를 서버에 요청하여 받아온 뒤, 해당 값을 Json으로 바꾸는 과정이 존재한다. public class Example{ public static void main(String[] args){ double[] location = new GeoLocation().getLocation(); InternetConnection conn = new InternetConnection(); conn.conn..
[디자인패턴] 템플릿 메소드 패턴(Template Method Pattern) 템플릿 메소드 패턴(Template Method Pattern) 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체 일을 수행하는 구조는 변동이 없고, 특정 단계에서 수행하는 내용을 바꾸는 패턴이다. 즉, 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계를 다시 정의할 수 있게 해준다. 위 구조를 보면 부모 클래스인 AlgorithmBase에서 전반적인 과정을 수행하는 TemplateMethod()가 존재하고, 그 외에 세부 메서드인 Step1(), Step2(), Step3()가 존재한다. TemplateMethod()에서는 해당 세부 메서드를 수행하게 된다. 그리고 자식 클래스인 ConcreateAlgorithmA,B는 이를 상속 받는다. 피자 만들기 예시 한 마을에서 피자 달인인 밥 아저씨가..
[디자인패턴] 상태 패턴(State Pattern) 상태 패턴(State Pattern) 상태 패턴은 특정 상태마다 다르게 할 일을 정의하고 나아가 상태 자체를 객체화하는 디자인 패턴이다. 가장 쉬운 예시는 TV이다. TV는 ON/OFF 버튼으로 ON 상태, OFF 상태로 변환한다. 예시 컴퓨터의 전원 버튼을 누르면 전원이 켜지고, 켜진 상태에서 다시 전원 버튼을 누르면 컴퓨터를 종료할 수 있다. public class Computer { public static String ON = "on"; public static String OFF = "off"; private String state = ""; public Computer(){ setState(Laptop.OFF); } public void setState(String state){ this.st..