핸들러들의 체인을 따라 요청을 전달하는 디자인 패턴
각 핸들러는 요청을 처리할지 다음 핸들러로 전달할지를 결정한다.

interface ComponentWithContextualHelp {
void showHelp();
}
abstract class Component implements ComponentWithContextualHelp {
protected String tooltipText;
protected Container container;
@Override
public void showHelp() {
if (tooltipText != null) {
System.out.println("Tooltip: " + tooltipText);
} else if (container != null) {
container.showHelp();
}
}
}
abstract class Container extends Component {
protected java.util.List<Component> children = new java.util.ArrayList<>();
public void add(Component child) {
children.add(child);
child.container = this;
}
}
class Button extends Component {
public Button(String tooltipText) {
this.tooltipText = tooltipText;
}
}
class Panel extends Container {
private String modalHelpText;
public Panel(String modalHelpText) {
this.modalHelpText = modalHelpText;
}
@Override
public void showHelp() {
if (modalHelpText != null) {
System.out.println("Modal Help: " + modalHelpText);
} else {
super.showHelp();
}
}
}
class Dialog extends Container {
private String wikiPageURL;
public Dialog(String wikiPageURL) {
this.wikiPageURL = wikiPageURL;
}
@Override
public void showHelp() {
if (wikiPageURL != null) {
System.out.println("Opening wiki page: " + wikiPageURL);
} else {
super.showHelp();
}
}
}
class Application {
private Dialog dialog;
public void createUI() {
dialog = new Dialog("http://...");
Panel panel = new Panel("This panel does XYZ.");
Button okButton = new Button("This is the OK button.");
Button cancelButton = new Button("This is the Cancel button.");
panel.add(okButton);
panel.add(cancelButton);
dialog.add(panel);
}
public void onF1KeyPress(Component component) {
component.showHelp();
}
public static void main(String[] args) {
Application app = new Application();
app.createUI();
Component component = app.dialog.children.get(0).children.get(0); // OK Button
app.onF1KeyPress(component);
component = app.dialog.children.get(0); // Panel
app.onF1KeyPress(component);
component = app.dialog; // Dialog
app.onF1KeyPress(component);
}
}
장점
단점