Это правильная реализация шаблона Decorator? - PullRequest
4 голосов
/ 04 июня 2011

Main.java

package com.example.decorator;

public class Main {
    public static void main(String[] args) {
        Response response = new Response();
        View head = new View("<title>Hello, world!</title>");
        View body = new View("<h1>Hello, world!</h1>");
        response.setContent(new HtmlLayout(head, body));
        response.render();
    }
}

Response.java

package com.example.decorator;

public class Response {
    private Response content;
    public Response () {}
    public <T extends Response> void setContent(T content) {
        this.content = content;
    }
    public void render() {
        this.content.render();
    };
}

View.java

package com.example.decorator;

public class View extends Response {
    private String content;
    public View(String content) {
        this.content = content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getContent() {
        return this.content;
    }
    public void render() {
        System.out.println(this.content);
    }
}

Layout.java

package com.example.decorator;

public class Layout extends Response {
    private Response view;
    public <T extends Response> Layout(T view) {
        this.view = view;
    }
    public void render() {
        this.view.render();
    }
}

HtmlLayout.java

package com.example.decorator;

public class HtmlLayout extends Response {
    private Response head;
    private Response body;
    public <T extends Response> HtmlLayout(T head, T body) {
        this.head = head;
        this.body = body;
    }
    public void render() {
        System.out.println("<!doctype html>");
        System.out.println("<html>");
        System.out.println("<head>");
        this.head.render();
        System.out.println("</head>");
        System.out.println("<body>");
        this.body.render();
        System.out.println("</body>");
        System.out.println("</html>");
    }
}

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Шаблон декоратора используется, когда вы хотите, чтобы объект типа (интерфейса) А делал больше, чем в настоящее время.Примером может быть: Веб-страница (логический экран), которая соответствует вашему физическому экрану, не нуждается в полосе прокрутки.однако, если страница (логический экран) не умещается на физическом экране, вы должны украсить ее полосой прокрутки.В словах GOF: цель Decorator состоит в том, чтобы динамически добавлять дополнительные обязанности к объекту.

В коде, который будет выглядеть следующим образом:

interface LogicalScreen {
  void render(String physical );
}

Реализация:

class SimpleScreen implements LogicalScreen {
  public void render(String physical) {
    // render itself
  }
}

Внедрение декоратора:

class ScreenWithScrollbar implements LogicalScreen {
  private final LogicalScreen decoratd;

  public ScreenWithScrollbar(LogicalScreen decorated) {
    this.decoratd = decorated;
  }

  public void render(String physical) {
    // render scroll bar
    // ...
    // render the decorated
    decoratd.render(physical);
    // eventually do some more stuff
  }

  public doScroll() {}
}

Как подключено:

public class WhatIsDecorator {
  public static void main(String[] args) {
    LogicalScreen l1 = new SimpleScreen();
    LogicalScreen ds = new ScreenWithScrollbar(l1);

    ds.render("MyMonitor");
  }
}

Вы можете связать столько, сколько вам нужно.Decorator2 (Декоратор1 (Простой)) ...

0 голосов
/ 04 июня 2011

Насколько я кратко посмотрел:

  • Измените свой ответ на интерфейс
  • Ваш View.java на самом деле не соответствует шаблону декоратора, поэтому удалите расширения Response, например,

С наилучшими пожеланиями

...