class Entity {
private int age;
private String name;
public Entity setAge(int age) { System.out.println("[Entity] Entity-setAge"); this.age = age; return this; }
public Entity setName(String name) { System.out.println("[Entity] Entity-setName"); this.name = name; return this; };
public int getAge() { return this.age; }
public String getName() { return this.name; }
}
class Usecase implements InputPort{
private Entity entity;
private OutputPort op;
public Usecase(Entity e, OutputPort op){this.entity = e; this.op = op;}
public void setEntity(int age, String name){
System.out.println("[Port] InputPort-setEntity");
publishEntity(age, name);
}
public void publishEntity(int age, String name){
System.out.println("[Usecase] Usecase-publishEntity");
entity.setAge(age)
.setName(name);
op.setDTO("Result: " + entity.getAge() + "," + entity.getName());
}
}
interface OutputPort {
public void setDTO(String data);
}
interface InputPort {
public void setEntity(int age, String name);
}
class DTO {
private String data;
public DTO(){}
public void setData(String data) { this.data = data;}
public String getData(){ return this.data; }
}
class Presenter implements OutputPort {
private DTO dto;
public Presenter(DTO dto){ this.dto = dto; }
public void setDTO(String data) {
System.out.println("[Port] OutputPort-setDTO");
dto.setData(data);
printData(dto.getData());
}
public void printData(String data) {
System.out.println("[Adapter] Presenter-printData");
System.out.println(data);
}
}
class Controller {
private InputPort ip;
public Controller(InputPort ip) { this.ip = ip; }
public void printData(int age, String name){
System.out.println("[Adapter] Controller-printData");
ip.setEntity(age, name);
}
}
주의할 점!
만약 Presenter 에서 OutputPort 를 구현해서 Usecase Layer 에 접근하는 것이 아니였다면, 1번처럼 계층간 의존 관계 원칙을 위반한 셈이다.
이렇게 Usecase 계층의 InputPort 와 OutputPort 는 DIP 에 의거하여 의존 관계 재설정 및 결합력 감소의 효과를 제공
public class Main
{
public static void main(String[] args) {
Entity entity = new Entity();
DTO dto = new DTO();
OutputPort presenter = new Presenter(dto);
Usecase usecase = new Usecase(entity, presenter);
Controller controller = new Controller(usecase);
controller.printData(12, "Henry");
}
}
결과는 아래와 같이 나오는 것을 확인할 수 있음
[Adapter] Controller-printData
[Port] InputPort-setEntity
[Usecase] Usecase-publishEntity
[Entity] Entity-setAge
[Entity] Entity-setName
[Port] OutputPort-setDTO
[Adapter] Presenter-printData
Result: 12,Henry
제어의 흐름 : Adapter -> Port -> Usecase -> Port -> Adapter