티스토리 뷰
Model-View-Controller(MVC) 패턴 과 Entity-Control-Boundary(ECB) 패턴 정리
꿈을 위해 잠을 잊은 그대에게 2020. 5. 27. 16:22Implementing Use Cases
Model-View-Controller Pattern
Application data 및 logic (모델로 캡슐화 됨)은 presentation logic (뷰 및 컨트롤러로 캡슐화 됨)과 독립적이어야합니다.
View는 사용자 입력 및 출력을 담당합니다. dialog box는 view의 좋은 예입니다.
Controllers는 모델에서 수행 할 수 있는 허용 가능한 트랜잭션에 대한 논리를 구현합니다.
Model은 세분화 된 비즈니스 로직과 데이터를 캡슐화합니다.
상호 작용을 보여주는 시퀀스 다이어그램은 다음과 같습니다:
The Entity-Control-Boundary Pattern
ECB (Entity-Control-Boundary Pattern)는 Model-View-Controller 패턴의 변형입니다.
Entity, Control 및 Boundary는 클래스 스테레오 타입이지만 UML에는 이를 나타내는 몇 가지 특수 아이콘이 있습니다:
특수 아이콘이 없는 동일한 다이어그램은 다음과 같습니다:
Entity는 시스템 데이터 (고객, 거래, 장바구니 등)를 나타내는 개체입니다.
Boundary는 사용자 interfaces, gateways, proxies 등 시스템 액터와 인터페이스하는 객체입니다.
Control은 Boundary와 Entity 사이를 중재하는 객체입니다. 그들은 경계에서 오는 명령의 실행을 조정합니다.
ATM Example
The Hexagonal Architecture Pattern (aka Ports & Adapters)
The Hexagonal Architecture는 객체를 3 개의 중첩 된 육각형으로 분할합니다. 내부 육각형의 Entities, 중간 육각형의 controllers, 외부 육각형의 boundaries 및 외부 육각형 외부의 액터 :
액터는 Boundary 객체와 상호 작용합니다.
Boundary 객체는 Control 객체에 명령을 내립니다.
Control 객체는 액터로부터 더 많은 정보를 얻기 위해 쿼리를 Boundary 객체로 다시 보낼 수 있습니다.
그런 다음 Control은 Entity를 업데이트합니다.
Entity 간의 변경 사항을 반영하기 위해 필요에 따라 Boundary가 새로 고쳐집니다.
Mapping to MVC
Entity로 채워진 내부 육각형을 Model-View-Controller 패턴의 Model 역할에 매핑 할 수 있습니다. Control은 분명히 Controller에 매핑되고 최소한 사용자와 상호 작용하는 Boundary는 View에 매핑됩니다.
The Hexagonal architecture 에는 몇가지 유용한 기능이 있습니다.
1. 사용자 인터페이스와 서버 및 장치와 같은 다른 유형의 행위자에 대한 인터페이스를 구분하지 않습니다.
2. Boundary 객체를 Control에 필요한 인터페이스를 구현하는 모든 객체로 볼 수 있습니다. 이 인터페이스는 boundary of the middle hexagon의 포트로 볼 수 있습니다. Boundary 객체를 실제 액터 인터페이스 또는 모의 액터로 구현할 수 있기 때문에 테스트가 쉬워집니다.
The Use Case Controller Pattern
개발자는 종종 특정 사용 사례가 구현되는 디자인의 위치를 가리키는 데 어려움을 겪습니다. 이 문제는 특정 컨트롤러 개체로 각 사용 사례를 식별하여 완화 할 수 있습니다. 이 경우 컨트롤러를 Use Case Controller라고합니다.
A Framework
프레임 워크를 사용하여 한 단계 더 나아갈 수 있습니다:
Java implementation:
abstract class Model extends Observable implements Serializable {
}
interface Oracle {
String ask(String query);
}
abstract class Boundary implements Oracle, Observer {
protected Model myModel;
public Boundary(Model m) {
myModel = m;
myModel.subscribe(this);
}
}
abstract class UseCaseController implements Oracle {
protected Model myModel;
abstract public String execute(Oracle caller, String cmmd) throws Exception;
}
Customizing the Framework
ATM 시스템에 프레임 워크를 사용자 정의 할 수 있습니다:
The business Package
The presentation Package
특정 Use Case Controller는 유스케이스의 시나리오를 구현합니다:
class TransferFunds extends UseCaseController {
private Bank bank; // my collaborator
private String amount, source, destination; // info from boundary
// called by bank:
public String ask(String query) {
if (query.eqauls("Source?")) {
return source;
} else if (query.equals("Destination?")) {
return destination;
} else if (query.equals("Amount?")) {
return amount;
} else {
return "unknown";
}
}
// called by boundary:
public String execute(Oracle caller, String cmmd) throws Exception {
source = caller.ask("Source?");
destination = caller.ask("Destination?");
amount = caller.ask("Amount?");
String response = bank.ask("transfer funds");
if (!response.equals("success")) {
throw new Exception(response);
}
return response;
}
}
'Dev > Design Pattern' 카테고리의 다른 글
헤드퍼스트 디자인 패턴: 어댑터 패턴 (Adapter Pattern) (0) | 2020.06.04 |
---|---|
헤드퍼스트 디자인 패턴: 커맨드 패턴 (Command Pattern) (0) | 2020.06.03 |
헤드퍼스트 디자인 패턴: 싱글턴 패턴 (Singleton Pattern) (0) | 2020.05.16 |
헤드퍼스트 디자인 패턴: 팩토리 패턴 (Factory Pattern) (0) | 2020.05.15 |
헤드퍼스트 디자인 패턴: 데코레이터 패턴 (Decorator Pattern) (0) | 2020.05.14 |
- Total
- Today
- Yesterday