본문 바로가기

책/헤드퍼스트 디자인패턴

[컴파운드패턴] 디자인 패턴 합치기 안녕하세요 남갯입니다. 오늘은 디자인패턴을 여러개 섞어서 문제를 해결하는 컴파운드 패턴에 대해 포스팅 해보려고합니다. 컴파운드 패턴이란?반복적으로 생길수 있는 일반적인 문제를 해결하기 위한 용도로 두개 이상의 패턴을 결합해서 사용하는것을 뜻합니다. 1. 우선 SImUDuck 오리 시뮬레이터를 개조해보겠습니다. interface Quakable{ fun quack() }오리의 행동을 구현하고 class MallardDuck : Quakable{ override fun quack() = println("Quack") } class RedheadDuck : Quakable{ override fun quack() = println("Quack") }두가지의 오리를 만들었습니다. class DuckCall : Q..
[디자인패턴] 프록시 패턴 Proxy pattern 안녕하세요 남갯입니다 오늘은 프록시 패턴에 대해 포스팅해보려고합니다. 사건의 발단이전시간에 진행했던 뽑기 기계의 재고와 현재상태를 알아낼 수 있도록 해달라는 부탁이 왔습니다. 위치를 알아낼 수 있는 코드를 만들기 위해 class GumballMachine(val location: String, val count: Int) { } 이와같이 생성하고 class GumballMonitor(val machine: GumballMachine) { fun report() { println("뽑기 기계 위치: ${machine.location}") println("현재 재고: ${machine.count}") } } 모니터 클래스를 생성해서 기계의 상태를 가져오는것을 만들었습니다. fun main() { val co..
[디자인패턴] 스테이트 패턴 (State) 안녕하세요 남갯입니다 오늘은 스테이트 패턴에 대해 포스팅 해보려고 합니다. 사건의 발단 뽑기회사에서 뽑기 프로그램을 만들게 되었습니다. 총 상태는 아래와같이 4가지가 있고,동전없을때 동전을 넣으면 동전있음으로 바뀌고, 이것이 상태의 전환입니다. 즉 상태는 4개이고 1.동전 있음2.동전 없음.3.알맹이 판매.4.알맹이 매진. 행동도 4개가 되는거죠1. 동전 투입2. 동전 반환3. 손잡이 돌림4. 알맹이 내보냄 이제 상태 기계 역할을 하는 클래스를 만들어보겠습니다.fun insertQuarter(){ if(state == HAS_QUARTER){ println("동전은 한개만 넣어주세요") }else if(state == SOLD_OUT){ println("매진되었습니다. 다음 기회에 이용해주세요.") }e..
[디자인패턴] 이터레이터 패턴 안녕하세요 남갯입니다. 오늘은 이터레이터 패턴에 대해 포스팅 해보려고 합니다. 사건의 발단객체마을의 식당과 객체마을의 팬케이크 하우스의 두 가게가 합쳐지면서 메뉴를 합의해서 바꿔야하는 원인이 생겼습니다.한쪽은 ArrayList를 이용해서 만들었고 한쪽은 배열을 써서 만들었습니다. 두 가게는 메뉴를 구현하는 방법에 대해 합의를 보게 되었습니다. class MenuItem( val name: String, val description: String, val vegetarian: Boolean, val price: Double ) 이렇게 말이죠 두 가게가 어떤 문제때문에 싸우는지 보겠습니다. 팬케익을 만드는 하우스의 메뉴는 아래와 같습니다.class pancakeHouseMenu(val menuItems: A..
[디자인패턴] 템플릿 메소드 패턴 안녕하세요 남갯입니다. 오늘은 템플릿 메소드 패턴에 대해 포스팅 해보려고 합니다. 사건의 발단 커피와 차에 공통점이 있는데 매우 비슷한 방법으로 만들어진다고 합니다. - 커피만드는법1. 물을 끓인다2. 물에 커피를 우려낸다3. 커피를 컵에 딸느다.4. 설탕과 우유를 추가한다. 커피를 클래스화 해보겠습니다. class Coffee{ fun prepareRecipe(){ boilWater() brewCoffeeGrinds() pourInCup() addSugarAndMilk() } fun boilWater(){ println("물 끓이는중") } fun brewCoffeeGrinds(){ println("필터를 통해서 커피를 우려내는 중") } fun pourInCup(){ println("컵에 따르는 중"..
[디자인패턴] 어댑터 패턴과 퍼사드 패턴 안녕하세요 남갯입니다 오늘은 어댑터 패턴과 퍼사드 패턴에 대해 포스팅 해보려고 합니다. 어댑터 패턴 사건의 발단 객체지향 어뎁터는 그렇게 어렵지 않게 알 수 있습니다. 특히 안드로이드에서는 리사이클러뷰나 리스트뷰에 어댑터를 이용하기도 하고,실생활에서는 유럽여행을 갈때 220v 플러그를 110v에 동작이 가능하도록 하는 어댑터를 통해 여행을 가게 됩니다.쉽게말해서 어떤 인터페이스를 클라이언트에서의 요구하는 형태의 인터페이스로 적응시켜주는 역할을 하게 됩니다. 실제 코드를 오리와 칠면조를 통해 알아보겠습니다. interface Duck { fun quack() // 꽥꽥 fun fly() // 멀리날아감 } class MallardDuck : Duck { override fun quack() { printl..
[디자인패턴] 커맨드패턴 안녕하세요 남갯입니다오늘은 커맨드 패턴에 대해 포스팅해보려고합니다 사건의 발단이전의 날씨 관련 옵져버 패턴 프로그래밍을 성공적으로 완수하면서 추가적인 일을 맡게되었습니다.각 프로그래밍이 가능한 슬롯이 있는 홈 오토메이션 리모컨의 API의 디자인을 의뢰받았습다. 실제 가전제품에는 TV , Light garage 등 각자의 다른 클래스들의 동작이 있었습니다. TV = on, off, setchannel , setvolumelight = on, offgarage = up, down , stop, lighton, lightdown, lock........ 클래스를 보아하니 공통적인것은 없을것이고 앞으로 이런 클래스가 더 추가가 가능할지도 모릅니다. 그래서 우리는 커맨드패턴을 이용하기로 했습니다. 실제 식당에서 ..
[디자인패턴] 팩토리패턴 안녕하세요 남갯입니다 오늘은 팩토리 패턴에 대해 포스팅해보려고합니다. 사건의발단피자가게를 운영하고 있고 피자가게의 코드를 아래와 같이 만들었습니다. fun orderPizza(): Pizza { val pizza = Pizza().apply { prepare() bake() cut() bake() } return pizza } 하지만 피자에는 종류는 여러개이므로 코드에 피자종류를 추가하게 되었습니다. enum class PizzaType { CHEESE, GREEK, PEPPRONI } fun orderPizza(type: PizzaType): Pizza { var pizza: Pizza when (type) { PizzaType.CHEESE -> pizza = CheessPizza() PizzaType..