Design Pattern22 14. 커맨드 패턴( Command pattern) 커맨드 패턴 요청을 캡슐화하여 호출자(invoker)와수신자(receiver)를 분리하는 패턴. 요청을 하는 쪽과 요청을 처리하는 쪽을 decoupling시킨다. --> 요청을 처리하는 방법이 바뀌더라도, 호출자의 코드는 변경되지 않는다. 코드로 알아보기 불을 껏다 킬 수 있는 Button클래스가 있고 불에 해당하는 Light클래스가 있다고 해보자. 현재 코드에서 Button은 불을 끄도록 Light light 객체에서 on() 또는 off()로 요청한다. 즉 Button은 Invoker, Light는 receiver이다. ❗️문제점❗️ 문제점 1. 그런데 버튼 눌렀을 때 불을 켜야 한다면 어떨까? 그렇게 되면 위의 Button클래스에서 light.off()를 light.on()으로 바꿔줘야 한다. 문.. 2021. 12. 24. 13. 책임 연쇄 패턴 (chain - of - responsibility) 책임 연쇄 패턴 ⛓ 요청을 보내는 쪽(sender)과 요청을 처리하는(receiver) 쪽을 분리하는 패턴 --> 핸들러 체인을 사용해서 요청을 처리한다. 코드로 알아보기 사용자가 특정 핸들러를 사용할 때, 이 사용자가 핸들러를 사용할 수 있는 사용자인지 인증을 해야하는 비즈니스 로직이 있다고 가정해보자. 먼저 Client의 코드는 아래와 같다. 이를 실행하면 아래와 같다. 요청인 Request 객체와 핸들러인 RequestHandler 객체는 아래와 같다. RequestHandler는 단순히 Request의 body를 출력해준다. ❗️문제점 ❗️ 그런데 위의 RequestHandler에 보이듯이 하나의 핸들러가 두가지 역할을 담당하고 있다.(주석에 써있는 글을 코드라고 가정한다.) 그것은 바로 1.인증.. 2021. 12. 23. 12. 프록시 패턴 (proxy pattern) 프록시 패턴 proxy : 대리인 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴. 즉 특정 객체에 접근하기 전에 프록시 객체를 먼저 지나서 접근하게 된다. -> 초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용하여 사용할 수 있다. 코드로 알아보기 아래와 같은 Client가 GameService의 코드는 바꾸지 않고 startGame이 실행되고 종료되기까지 얼마나 시간이 걸리는지 알고 싶다면? GameService 프록시 패턴을 적용하지 않는다면 Client코드의 main시작 부분과 startGame마지막 부분에 시간을 재면 될 것이다. 하지만 프록시 패턴을 적용하면 이렇게 하지 않아도 된다. 먼저 GameService를 전혀 건드리지 않고 측정하는 방법을 보자. (GameSer.. 2021. 12. 23. 11. 플라이웨이트 패턴 (flyweight pattern) 플라이웨이트 패턴 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴 -> 자주 변하는 속성(또는 외적인 속성, extrinsit)과 자주 변하지 않는 속성(또는 내적인 속성, intrinsit)을 분리하고 재사용하여 메모리 사용을 줄일 수 있다. 코드로 알아보기 편집기를 만든다고 생각하고 글자들을 관리하기 위해 Character클래스가 필요하다고 해보자. 하나의 글자마자 value, color, fontFamily, fontSize가 부여된다. 이를 사용하는 Client는 아래와 같을 것이다. ❗️문제점 ❗️ Client를 보면 value만 다른 Character객체를 5개씩 만들고 있다. Character객체는 분명 상당히 많이 필요할텐데 이렇게 4개의 필드를 가지는 무거운 객체를 계속해서 만드는 것에는.. 2021. 12. 22. 이전 1 2 3 4 5 6 다음