= Architectural Pattern = 주어진 상황에서 소프트웨어 아키텍처에서 흔히 발생하는 문제에 대한 일반적으로 재사용 가능한 해법. https://en.wikipedia.org/wiki/Architectural_pattern {{tag>Architecture Modeling Design_Pattern Architectural_Pattern}} = Model-View-Presenter = Presenter가 중개인이자 데이터 가공 역할. View와 Presenter간의 위임으로 View에서 데이터 처리 요청 및 그에 대한 Callback을 받는다. 또한 Model에 접근할 수 있는건 오직 Presenter. == Interface == package api; public interface BaseMVPContract { interface View {} interface Presenter { void setView(V view); } } package api.concrete; import api.BaseMVPContract; public interface TaskMVPContract { interface View extends BaseMVPContract.View { void onResponse(String message); } interface Presenter extends BaseMVPContract.Presenter { void request(String message); } } == ConcreteView == package view; import api.concrete.TaskMVPContract; import presenter.TaskPresenter; public class TaskView implements TaskMVPContract.View { private TaskPresenter presenter; public TaskView() { presenter = new TaskPresenter(); presenter.setView(this); } public void requestData(String message) { presenter.request(message); } @Override public void onResponse(String message) { System.out.println(message); } } == ConcretePresenter == package presenter; import api.concrete.TaskMVPContract; import api.concrete.TaskMVPContract.View; public class TaskPresenter implements TaskMVPContract.Presenter { private TaskMVPContract.View view; @Override public void setView(View view) { this.view = view; } @Override public void request(String message) { StringBuilder sb = new StringBuilder(); sb.append("+++"); sb.append(message); sb.append("+++"); view.onResponse(sb.toString()); } } == Client == 만약 GUI 환경이라면 사용자 입력에 대한 동작. import view.TaskView; public class Client { public static void main(String[] args) { TaskView v = new TaskView(); v.requestData("Hello world"); } } /* +++Hello world+++ */