2
我試圖在使用MVP模式的場景中應用面向對象編程的原則。 我有4個解決方案,最後兩個我更喜歡。然而,大多數解決方案將SRP,IOC/DIP,開放閉合原理等某些原理分解。使用MVP模式和麪向對象原理
簡而言之,我希望查看器和演示者可以具有可選行爲。這種行爲允許觀看者有一個窗口或被包含在一個面板中。 在我看來,觀衆應該瞭解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();
}
}
謝謝
在提出解決方案之前,有助於瞭解問題所在。你能解釋一下你想解決什麼問題,而不是通過閱讀4個長長的代碼來猜測它是什麼嗎? – 2012-01-07 20:42:06
我改進了這個問題。 – ConradoQG 2012-01-07 20:57:11
太抽象了,需要更實際 – Daniel 2012-01-22 20:35:06