1.白盒框架
- 通过继承和覆盖方法进行扩展
- 通用设计模式:模板方式
- 子类具有主要方法,但对框架进行控制
应用白盒框架的例子:
public abstract class PrintOnScreen {
public void print() {//框架REUSE的主体
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame, textToShow());
frame.dispose();
}
protected abstract String textToShow();
}
public class MyApplication extends PrintOnScreen {
@Override
protected String textToShow() {
return "printing this text on "
+ "screen using PrintOnScreen "
+ "white Box Framework";
}
}
2.黑盒框架
- 通过实现插件接口进行扩展
- 通用设计模式:策略模式,观察者模式
- 插件加载机制加载插件并对框架进行控制
应用黑盒框架的例子:
public interface Plugin {
String getApplicationTitle();
String getButtonText();
String getInititalText();
void buttonClicked() ;
void setApplication(Application app);
}
public class Application extends JFrame {
private JTextField textField;
private Plugin plugin;
public Application() { }
protected void init(Plugin p) {
p.setApplication(this);
this.plugin = p;
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(new BevelBorder(BevelBorder.LOWERED));
JButton button = new JButton();
button.setText(plugin != null ? plugin.getButtonText() : "ok");
contentPane.add(button, BorderLayout.EAST);
textField = new JTextField("");
if (plugin != null) textField.setText(plugin.getInititalText());
textField.setPreferredSize(new Dimension(200, 20));
contentPane.add(textField, BorderLayout.WEST);
if (plugin != null)
button.addActionListener((e) -> { plugin.buttonClicked(); } );
this.setContentPane(contentPane);
...
}
public String getInput() { return textField.getText(); }
}
3.黑盒框架和白盒框架对比
白盒框架使用子类/子类型---继承
- 允许扩展每个非私有方法
- 需要了解超类的实现
- 一次只能有一个分机
- 汇编在一起
- 通常所谓的开发者框架
黑盒框架使用组合 - 委派/组合
- 允许扩展在界面中显示的功能
- 只需要了解接口
- 多个插件
- 通常提供更多的模块化
- 可以单独部署(.jar,.dll,...)
- 通常称为最终用户框架,平台
在实际应用中,通常是同时使用两种框架,以达到用户的需求。