
🐙 전략 패턴이란? 소프트웨어 설계에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 솔루션 일을 수행하는 방법이 여러가지인 경우, 이를 공통된 인터페이스로 추상화하여 로직을 수행하는 곳에서는 인터페이스만 사용하고, 실행 시에는 이 알고리즘을 바꿔낄 수 있도록 함 🐙 전략 패턴 구현하기 사람이 이동하는 수단에는 여러가지가 있다고 가정해보자. Strategy public interface Strategy { void move(); } ConcreteState - Strategy 를 구현한 클래스 public class TrainStrategy implements Strategy { @Override public void move() { System.out.println("기차로 이동합니다."..

🐙 상태 패턴이란? 텔레비전이 꺼져 있는 상태에서는 리모컨을 눌러도 아무런 변화가 없는 것과 같이 상태에 따라 다른 결과가 나타나도록 하는 것 글을 작성 중인 상태에서는 다른 사용자들이 조회할 수 없는 것 상태 변경에 따라 특정한 오브젝트들의 패턴이 바뀌는 것 자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않고 상태를 객체화 하여 상태가 행동을 할 수 있도록 위임하는 패턴 ex) public void view(User user) { this.state.view(user); } view 라는 메서드를 호출할 때 상태에 따라 다른 결과가 나타난다면, 해당 객체가 직접 자신의 상태를 확인하여 분기하는 것이 아니라 상태를 호출하여 변화가 생길 수 있도록 한다. 🐙 상태 패턴 구현하기 글을 게시하고, ..

🐙 옵저버 패턴이란? 객체의 상태 변화를 관찰하는 관찰자들 (옵저버) 의 목록을 등록하여 상태 변화가 있을 때마다 객체가 직접 목록의 각 옵저버에게 이를 알리도록 하는 디자인 패턴 Subject 는 주로 옵저버를 등록하거나 해지함 상태가 변경될 때마다 Subject 는 observers 를 순회하며 해당되는 메서드를 모두 호출함 인터페이스 없이도 구현할 수 있지만 인터페이스가 없다면 Observers 의 type 이 Object 가 되어 어떤 메서드를 호출해야 할지 명확하지 않게 되기 때문에 인터페이스를 만드는 것이 더 효율적 🐙 옵저버 패턴 구현하기 메일링 서비스를 구현한다고 생각해보자. 구독자(옵저버)가 필요하고 해당 서비스를 해주는 주체(Subject)가 필요하다. public interface O..

🐙 메멘토 패턴이란? 객체의 상태를 외부에 저장해놓고 복원하고자 할 때 사용하는 패턴 객체 내부의 상태를 밖에 저장하기 위해서는 객체의 상태가 온전히 외부에 노출되어야 하는데, 이 과정에서 캡슐화를 통해 일일이 공개하지 않으면서도 복원을 가능하도록 하는 방법 🐙 메멘토 패턴 구현해보기 갖고 있던 잔고를 기억하는 기능을 구현한다고 가정해보자 public class Originator { private int money; public void setState(int money) { this.money = money; } public int getState() { return money; } public Memento saveStateToMemento() { return new Memento(money); }..

🐙 중재자 패턴이란? 객체들 간의 의사소통 하는 방법을 추상화하여 결합도를 낮추는 방법 M:N → 1:N의 관계로 바꾸는 방법 🐙 중재자 패턴 구현해보기 채팅을 보내는 서비스를 구현한다고 가정해보자. public abstract class Colleague { Mediator mediator; String name; public Colleague(Mediator mediator, String name) { this.mediator = mediator; this.name = name; } public abstract void sendMessage(Colleague to, String message); public String getName() { return name; } } Colleague 인터페이스는..

🐙 이터레이터 패턴이란? 집합 객체를 순회하면서도 내부 구조를 노출시키지 않고 순회하는 방법을 제공하는 패턴 Aggregate 는 집합체를 뜻한다. 예를 들어, 냉장고에 과일이라는 객체가 가득하다고 가정한다면 냉장고는 Aggregate 인 것이다. 🐙 이터레이터 패턴 구현해보기 이터레이터 패턴을 적용하지 않은 경우 냉장고에 과일을 담고, 이를 차례차례 조회하는 경우를 생각해보자. public class App { public static void main(String[] args) { Refrigerator refrigerator = new Refrigerator(); refrigerator.addFruit(new Fruit("딸기")); refrigerator.addFruit(new Fruit("사과"..

🐙 커맨드 패턴이란? - 요청을 캡슐화하여 호출자와 수신자를 분리하는 패턴 - 어떤 operation 을 호출해야 하고, 어떤 receiever 가 필요한지에 대하여 추상화 - command 인터페이스의 execute 라는 메서드 뒤로 모든 명령을 숨김 - 실행될 기능을 캡슐화함으로써 기능의 실행을 요구하는 호출자(Invoker) 클래스와 실제 기능을 실행하는 수신자(Receiver) 클래스 사이의 의존성을 제거함. 🐙 커맨드 패턴 구현해보기 커맨드 패턴을 적용하지 않은 경우 불을 켜고 끄는 기능을 하는 Light 라는 클래스와 Button 이라는 클래스가 있다고 가정해보자. public class Light { private boolean isOn = false; public void turnOn() ..

🐙 책임 연쇄 패턴이란? 만일, 요청을 처리하는 핸들러를 구현한다고 생각해보자. 🧙🏻 핸들러를 구현하고 났더니, 검증되지 않은 사용자를 확인하는 기능을 붙인다고 생각해보자. 🧙🏻 그러고 났더니 이번에는 특정 IIP 주소에서 오는 반복적인 요청은 걸러내는 보안 기능을 추가했다고 가정해보자. 🧙🏻 이후에는 또 다시 캐시된 결과를 이용해서 속도를 높이자고 주장했다고 가정해보자. 이렇게 점차 하나씩 기능이 쌓여갈 때마다 코드를 수정할 것인가? 기존의 핸들러 코드에 이러한 기능들을 추가하게 된다면, 단일 책임 원칙에도 어긋나고 OCP 에도 어긋나게 될 것이다. (계속해서 코드 수정이 있기 때문에) 어떤 클래스가 변경되어야 하는 이유는 오직 한가지 이유여야 한다. (단일책임원칙) 책임 연쇄 패턴에서는 이를 위하여 ..