Я пытаюсь применить принципы объектно-ориентированного программирования в сценарии, в котором используется шаблон MVP.Я получил 4 решения, а последние два мне понравились больше.Однако большинство решений нарушают определенные принципы, такие как SRP, IOC / DIP, принцип Open-Closed и т. Д.
Вкратце, я хочу, чтобы зритель и докладчик могли иметь необязательное поведение.Такое поведение позволяет зрителю иметь окно или содержаться в одной панели.По моему мнению, зритель должен иметь знания о JFrame и слушателях, оконный докладчик должен выполнить некоторые дополнительные действия, когда зритель поддерживает выбранное поведение окна.
Можете ли вы помочь мне найти лучший дизайн для этой ситуации?Полагаю, что примеры прояснят необходимость.
Решение 1 - Адаптер типа
public class Main {
public static void main(String[] args) {
ConcreteWindowedView view = new ConcreteWindowedView();
Presentable presenter = new ConcreteWindowedPresenter(view);
presenter.present();
}
}
public interface Presentable {
public void present();
}
public interface Viewable {
public void view();
}
public class ConcreteView implements Viewable {
private Container container;
public ConcreteView(Container container) {
this.container = container;
}
public void view() {
// Configure UI (TextBox, Buttons) inside container;
}
}
public class ConcretePresenter implements Presentable {
private Viewable viewable;
public ConcretePresenter(Viewable viewable) {
this.viewable = viewable;
}
public void present() {
// Configure presenter;
viewable.view();
// Register UI action listener
}
}
public class ConcreteWindowedView implements Viewable {
private ConcreteView contentView;
private JFrame frame;
public ConcreteWindowedView() {
frame = new JFrame();
contentView = new ConcreteView(frame.getContentPane());
}
public void view() {
contentView.view();
}
public void addWindowListerner() {
}
}
public class ConcreteWindowedPresenter implements Presentable {
private ConcreteWindowedView windowedView;
private ConcretePresenter concretePresenter;
public ConcreteWindowedPresenter(ConcreteWindowedView windowedView) {
this.windowedView = windowedView;
this.concretePresenter = new ConcretePresenter(windowedView);
}
public void present() {
// Configure presenter
concretePresenter.present();
// Register window listeners
this.windowedView.addWindowListerner();
}
}
Решение 2 - Использование наследования
public class Main {
public static void main(String[] args) {
ConcreteWindowedView view = new ConcreteWindowedView();
Presentable presenter = new ConcreteWindowedPresenter(view);
presenter.present();
}
}
public interface Viewable {
public void view();
}
public interface Presentable {
public void present();
}
public class ConcreteView implements Viewable {
protected Container container;
protected ConcreteView() {
}
public ConcreteView(Container container) {
this.container = container;
}
public void view() {
// Configure UI (TextBox, Buttons) inside container;
}
}
public class ConcreteWindowedView extends ConcreteView {
public JFrame frame;
public ConcreteWindowedView() {
frame = new JFrame();
container = frame.getContentPane();
}
public void view() {
// Configure view
super.view();
// Show JFrame
}
public void addWindowListerner() {
}
}
public class ConcretePresenter implements Presentable {
Viewable viewable;
public ConcretePresenter(Viewable viewable) {
this.viewable = viewable;
}
public void present() {
// Configure presenter;
viewable.view();
// Register UI action listener
}
}
public class ConcreteWindowedPresenter extends ConcretePresenter {
private ConcreteWindowedView concreteWindowedView;
public ConcreteWindowedPresenter(ConcreteWindowedView viewable) {
super(viewable);
this.concreteWindowedView = viewable;
}
public void present() {
// Configure presenter
super.present();
// Register window listeners
this.concreteWindowedView.addWindowListerner();
}
}
Решение 3 - Использование обработчика окна
public class Main {
public static void main(String[] args) {
Viewable view = new ConcreteView();
Presentable presenter = new ConcretePresenter(view, new WindowViewHandler(view));
presenter.present();
}
}
public interface Viewable {
public void view();
public void setContainer(Container container);
}
public interface Presentable {
public void present();
}
public class ConcreteView implements Viewable {
Container container;
public ConcreteView() {
}
public ConcreteView(Container container) {
this.container = container;
}
public void view() {
if (container == null)
throw new RuntimeException("Container not set.");
// Configure UI (TextBox, Buttons) inside container;
}
public void setContainer(Container container) {
this.container = container;
}
}
public class ConcretePresenter implements Presentable {
Viewable viewable;
WindowViewHandler windowHandler;
public ConcretePresenter(Viewable viewable) {
this.viewable = viewable;
}
public ConcretePresenter(Viewable viewable, WindowViewHandler windowHandler) {
this(viewable);
this.windowHandler = windowHandler;
}
public void present() {
// Configure presenter
if (windowHandler != null)
windowHandler.addWindowListerner();
this.viewable.view();
}
}
public class WindowViewHandler {
Viewable viewable;
JFrame frame;
public WindowViewHandler(Viewable viewable) {
this.viewable = viewable;
initWindow();
}
private void initWindow() {
frame = new JFrame();
viewable.setContainer(frame.getContentPane());
}
public void addWindowListerner() {
}
}
Решение 4
public class Main {
public static void main(String[] args) {
ConcreteWindowedView view = new ConcreteWindowedView();
Presentable presenter = new ConcretePresenter(view);
presenter.present();
}
}
public interface Windowable {
public void addWindowListerner();
}
public interface Viewable {
public void view();
public void setContainer(Container container);
}
public interface Presentable {
public void present();
}
public class ConcreteView implements Viewable {
Container container;
public ConcreteView() {
}
public void setContainer(Container container) {
this.container = container;
}
public void view() {
if (container == null)
throw new RuntimeException("Container not set.");
}
}
public class ConcreteWindowedView extends ConcreteView implements Windowable {
JFrame frame;
public ConcreteWindowedView() {
}
public void view() {
frame = new JFrame();
super.setContainer(frame.getContentPane());
super.view();
}
public void addWindowListerner() {
}
}
public class ConcretePresenter implements Presentable {
Viewable viewable;
ConcreteWindowedView concreteWindowedView;
public ConcretePresenter(Viewable viewable) {
this.viewable = viewable;
}
public ConcretePresenter(ConcreteWindowedView concreteWindowedView) {
this.viewable = concreteWindowedView;
this.concreteWindowedView = concreteWindowedView;
}
public void present() {
// Configure presenter
if (concreteWindowedView != null)
concreteWindowedView.addWindowListerner();
this.viewable.view();
}
}
Спасибовы