前言
我最早听过同一个应用程序有不同的视图界面,叫留“后门”,那是在90年代未。00年代从自Android手机普及后,“开发者模式”这个词出现在我们眼前。
在过往的项目中,会用到这种设计,它主要有几类好处:
- 功能解锁。用极小的改动,让用户傻瓜式操作解锁一些特定功能;
- 黑盒测试。当出应用程序现异常时,对应用程序无需打任何补丁,就可以测试黑盒内部的逻辑;
- 协同测试。开启后,可以联系用户协同调试;
- 切换风格。可以在切换开发视图与普通用户视图,比较不同的区别;
- 隐藏彩蛋。
案例分析
开发者模式是一个很棒的设计,已经在各软件网站应用。比如:
- B站的粉丝视图/新访客视图
- Android 各版本的开发者模式
很多玩家是为了看版本彩蛋,才了解开发者模式。
一般是
设置--开发者选项--版本号(连击5次),就能启用“开发者模式”
开发者模式提供对:网络/显卡/内存/CPU/磁盘/屏幕等技术参数曲和测试数据。
向文本编辑器添加开发者模式
我首先要添加一处开关,不用做太复杂,就用简单的单选按钮。
- 向目录树添加“开发者”结点
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class TreePreference extends JTree {
private static final long serialVersionUID = 1L;
public TreePreference() {
super();
addComponentListener(new ComponentAdapterTreePreference());
setRootVisible(false);
setCellRenderer(new TreeCellRendererPreference());
init();
}
private void init() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
DefaultTreeModel treeModel = new DefaultTreeModel(root);
...
root.add(new DefaultMutableTreeNode("developer"));
setModel(treeModel);
}
}
- 向右侧面板添加“开发者”页面
import java.awt.CardLayout;
import javax.swing.JPanel;
public class PanelPreferenceContent extends JPanel {
private static final long serialVersionUID = 1L;
private CardLayout cardLayout;
public PanelPreferenceContent() {
super();
setLayout(cardLayout = new CardLayout());
init();
}
private void init() {
...
add(new PanelPreferenceDeveloper(), "developer");
}
public CardLayout getCardLayout() {
return cardLayout;
}
public void show(String stringId) {
cardLayout.show(PanelPreferenceContent.this, stringId);
}
}
- 开发者被勾选,记录布尔值为true
import java.util.prefs.Preferences;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
public class PanelPreferenceDeveloper extends JPanel {
private static final long serialVersionUID = 1L;
private JCheckBox checkBoxDeveloper;
public PanelPreferenceDeveloper() {
super();
{
JCheckBox checkBox = new JCheckBox(Editor.sInstance.getString("developer"));
checkBox.setSelected(PreferenceEditor.getPreferences().getBoolean("developer", false));
add(checkBox);
checkBoxDeveloper = checkBox;
}
}
public boolean apply() {
Preferences preferences = PreferenceEditor.getPreferences();
preferences.putBoolean("developer", checkBoxDeveloper.isSelected());
return true;
}
}
到此开关逻辑就完成了。
使用开发者模式
- 当“开发者”模式被启用时,“测试”菜单才显示。
import javax.swing.JMenuBar;
public class MenuBarMain extends JMenuBar {
private static final long serialVersionUID = 1L;
public MenuBarMain() {
super();
init();
}
private void init() {
add(new MenuFile());
add(new MenuView());
if (PreferenceEditor.getPreferences().getBoolean("developer", false)) {
add(new MenuTest());
} // end if
add(new MenuWindow());
add(new MenuHelp());
}
}
开者模式到这里就讲清楚了。后续会用这个思想,改进开发者模式版本,产生一些变形应用。但思想仍然是同一个。
关于“开发者”模式的注意事项
- 设计开发者模式时,不要太智能
- 比如:我这里“测试”菜单要重启程序才生效,不会在勾选后立即出现。
- 开发者模式的控制权限应该公平,不能留后门
- 能打开,就能关闭,不然就成了BUG,甚至是“后门”,对用户很不友好。
- 不能把开发者模式当万能药
- 用来隐藏彩蛋时,只能为了幽默有趣,不能为了恶搞或其它目的。
- 开发者模式不能替代专业测试工具,它只是一个辅助工具。
我目前用它来测试一些基础功能和新功能。
- 基础功能,例如:测试线程未捕捉异常的提示框
ActionListener actionListenerTest = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
@SuppressWarnings("unused")
int i = 1 / 0;
}
};
- 新功能,例如:多文档子窗口和代码流式着色等等。
- 进行中...
以上~