MVP パターンを使用するシナリオで、オブジェクト指向プログラミングの原則を適用しようとしています。私は 4 つの解決策を得ましたが、最後の 2 つはより気に入りました。ただし、ほとんどのソリューションは、SRP、IOC / DIP、Open-Closed Principleなどの特定の原則を分解しています.
簡単に言えば、視聴者とプレゼンターにはオプションの動作が必要です。この動作により、ビューアにウィンドウを表示したり、1 つのパネルに含めることができます。私の意見では、ビューアーは 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();
}
}
ありがとうございました