《重构,改善现有代码的设计》第八章 Duplicate Observed Data

Java代码 复制代码 收藏代码
  1. import java.awt.Color;
  2. import java.awt.Container;
  3. import java.awt.FlowLayout;
  4. import java.awt.Label;
  5. import java.awt.TextField;
  6. import java.awt.event.FocusAdapter;
  7. import java.awt.event.FocusEvent;
  8. import java.awt.event.WindowAdapter;
  9. import java.awt.event.WindowEvent;
  10. import java.util.Observable;
  11. import java.util.Observer;
  12. import javax.swing.JFrame;
  13. /**
  14. * 《重构,改善现有代码的设计》第八章 Duplicate Observed Data
  15. *
  16. * 业务逻辑:
  17. * 一个JFrame(类IntervalWindow)有三个TextField,分别是start,end和length
  18. * 如果你修改Start或End,length就会自动成为两者计算所得的长度
  19. * 如果你修改length,End就会随之改变(start不变)
  20. *
  21. * 主要是使用了Observer模式:
  22. * start,end和length之间的运算,是与具体界面无关的,应该独立出来(成为一个Subject,观察者模式里面的“目标”)
  23. *
  24. * 关键在于解决以下两个问题:
  25. * 1.什么时候计算?当界面上的TextField值有变动时,由WindowObserver调用Subject的set方法
  26. * 2.计算后如何通知界面?Subject调用notifyObservers方法,这个方法会触发WindowObserver的update方法
  27. *
  28. */
  29. public class ObserveGUIWindow {
  30. public static void main(String[] args) {
  31. new WindowObserver().init();
  32. }
  33. }
  34. class WindowObserver implements Observer {
  35. private TextField startField;
  36. private TextField endField;
  37. private TextField lengthField;
  38. private Subject subject;
  39. public void init() {
  40. JFrame f = new JFrame("This is a test");
  41. f.setSize(200, 200);
  42. Container content = f.getContentPane();
  43. content.setBackground(Color.white);
  44. content.setLayout(new FlowLayout());
  45. startField = new TextField("0", 10);
  46. endField = new TextField("0", 10);
  47. lengthField = new TextField("0", 10);
  48. SymFocus listener = new SymFocus();
  49. startField.addFocusListener(listener);
  50. endField.addFocusListener(listener);
  51. lengthField.addFocusListener(listener);
  52. Label startLabel = new Label("start:");
  53. Label endLabel = new Label("end:");
  54. Label lengthLabel = new Label("length:");
  55. content.add(startLabel);
  56. content.add(startField);
  57. content.add(endLabel);
  58. content.add(endField);
  59. content.add(lengthLabel);
  60. content.add(lengthField);
  61. f.setLocationRelativeTo(null);
  62. f.setVisible(true);
  63. f.addWindowListener(new WindowAdapter() {
  64. public void windowClosing(WindowEvent e) {
  65. System.exit(0);
  66. }
  67. });
  68. subject = new Subject();
  69. subject.addObserver(this);
  70. }
  71. //更新界面,最新的值(计算后)来自Subject
  72. public void update(Observable o, Object arg) {
  73. Subject subject = (Subject)o;
  74. startField.setText(subject.getStart());
  75. endField.setText(subject.getEnd());
  76. lengthField.setText(subject.getLength());
  77. }
  78. class SymFocus extends FocusAdapter {
  79. public void focusLost(FocusEvent event) {
  80. Object object = event.getSource();
  81. if (object == startField)
  82. StartFieldFocusLost(event);
  83. else if (object == endField)
  84. EndFieldFocusLost(event);
  85. else if (object == lengthField)
  86. LengthFieldFocusLost(event);
  87. }
  88. }
  89. void StartFieldFocusLost(FocusEvent event) {
  90. //从界面取得输入的值
  91. String start = startField.getText();
  92. subject.setStart(isInteger(start) ? start : "0");
  93. //交由Subject计算
  94. subject.calculateLength();
  95. }
  96. void EndFieldFocusLost(FocusEvent event) {
  97. String end = endField.getText();
  98. subject.setEnd(isInteger(end) ? end : "0");
  99. subject.calculateLength();
  100. }
  101. void LengthFieldFocusLost(FocusEvent event) {
  102. String length = lengthField.getText();
  103. subject.setLength(isInteger(length) ? length : "0");
  104. subject.calculateEnd();
  105. }
  106. boolean isInteger(String str) {
  107. return str != null && str.matches("[0-9]+");
  108. }
  109. }   
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值