Design Pattern/행위 패턴

    Template Method Pattern

    어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴 - 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용 - 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현 AbstractClass 템플릿 메서드를 정의하는 클래스 하위 클래스에 공통 알고리즘을 정의하고 하위 클래스에서 구현될 기능을 primitive 메서드 또는 hook 메서드로 정의하는 클래스 ConcreteClass 물려받은 primitive 메서드 또는 hook 메서드를 구현하는 클래스 상위 클래스에 구현된 템플릿 메서드의 일반적인 알고리즘에서 하위 클래스에 적합하게 pri..

    Strategy 전략 프로젝트에 적용 해보기

    문제사항 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class MemberApiControllerTest { ... } 스프링 부트에서 통합 테스를 위해서 위처럼 랜덤한 포트를 배정하게 하면서 내장 redis를 사용하게 되면 여러 스프링 테스트 컨텍스트가 실행되면 EmbeddedRedis가 포트충돌 이를 위해서 레디스를 실행할때 사용가능한 포트를 찾고 이를 레디스에 할당하게 해야 합니다. 여기서 문제는 저의 컴퓨터는 윈도우이고 서버는 리눅스이기 때문에 포트를 찾는 로직이 달라집니다. window public Process executeGrepProcessCommand(int port) throws IOExcept..

    State Pattern

    어떤 행위를 수행할 때 상태에 행위를 수행하도록 위임 시스템의 각 상태를 클래스로 분리해 표현 각 클래스에서 수행하는 행위들을 메서드로 구현 외부로부터 캡슐화하기 위해 인터페이스를 생성하여 시스템의 각 상태를 나타나는 클래스로 실체화 시작과 정지라는 상태로 하는 간단한 예제 1. 상태 인터페이스 public interface State { public void doAction(Context context); } 2. 상태별 구현 클래스 public class StartState implements State{ @Override public void doAction(Context context) { System.out.println("start"); context.setState(this); } @Over..

    Command Pattern

    커맨드 패턴(Command pattern)을 이용하면, 요구사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러가지 다른 요구사항을 집어넣을 수 도 있습니다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할 수도 있으며, 작업취소 기능도 지원이 가능합니다. 커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구 사항을 캡슐화한 것이라는 점을 이미 배웠습니다. 이렇게 하기 위해서 행동과 리시버를 한 객체에 집어넣고, execute()라는 메소드 하나만 외부에 공개하는 방법을 씁니다. 이 메소드 호출에 의해서 리시버에서 일련의 작업이 처리됩니다. 외부에서 볼 때는 어떤 객체가 리시버 역할을 하는지, 그 리시버에서 실제로 어떤 일을 하는지 알 수 없습니다. 그냥 execute() 메소드를 호출하..

    Strategy Pattern

    실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴 특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화하며 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다. 이점 컨텍스트 코드의 변경 없이 새로운 전략을 추가할 수 있다는 점입니다. 새로운 정책이 추가될 때 Strategy 인터페이스를 상속받아서 class를 구현하면 됩니다. 기존의 코드를 변경할 필요가 없죠. public interface Strategy { public int doOperation(int num1, int num2); } public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2)..