新人请教关于JAVA代码架构设计的问题,请高手赐教.

smzdgmail 2015-11-12 09:17:16
各位大虾, 小弟初学JAVA, 关于JAVA代码架构方面的一些问题始终弄不明白,还请赐教.
举个简单例子,基于将视图和业务逻辑分开的想法, 我创建了两个类.
类1是一个窗体, 其中有一个按钮叫OK, 有一个文本框Text.
类2是窗体相应的业务类,有一个方法(ButtonClicked), 第一个方法是执行窗体OK按钮的动作, 并将"Hello world!"写到窗体的文件框中.

那么问题来了, 类1和类2是分开的两个类, 相互是没有关系的,我如何让在类1中点按钮时执行类2中的相应方法?又如何让类2在执行该方法时更新类1的Text文本框?我能想到的是:
1. 创建第3个类, 在该类的Main函数中, 先实例化类2, 然后将类2的实例传给类1, 在类1点按钮时调用类2的方法,写成class2.buttonclicked(),这样实现了类1调用类2的方法,但类2反写类1的文件框又没法实现了,难道在call buttonclicked方法时,将当前窗体再传进去?
2. 创建接口类, 让类2实现这个接口, 然后同样将类2传给类1, 类1在点按钮时回调类2的接口方法, 原理同上面方法类似, 只是解耦了.

我实在不明白这种A类call B类方法, B类又反过来Call A类的时候,程序到底怎么写是最合理的?代码要实现功能固然是容易的, 但用什么样的方式是最合理的? 既要解耦, 又要代码合理, 优化, 是不是类似的情况一定要用回调? 但总不是A回调B的方法,B又回调A的方法,总有主次的, 要么A中引用B, 要么B中引用A, 总不能相互引用啊.

请高手赐教!
...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
三仙半 2015-11-12
  • 打赏
  • 举报
回复
设窗体类为F,处理类为P。 1、F有一个P类型的成员变量p,P有一个F类型的成员变量f;P的构造函数要求传入一个F类型的参数。 2、初始化窗体时,new一个P,并传入this。

//窗体类
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

/**
 * @author ZhengYesheng
 */
public class F extends JFrame
{
	private static final long serialVersionUID = 986609219821815561L;

	private JPanel contentPane;
	private JTextField textField;

	private P p;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
		{
			public void run()
			{
				try
				{
					F frame = new F();
					frame.setVisible(true);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public F()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		p = new P(this);

		textField = new JTextField();
		textField.setBounds(94, 68, 282, 21);
		contentPane.add(textField);
		textField.setColumns(10);

		JButton btnNewButton = new JButton("开始处理");
		btnNewButton.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				p.action();
			}
		});
		btnNewButton.setBounds(182, 158, 117, 23);
		contentPane.add(btnNewButton);
	}

	public JTextField getTextField()
	{
		return textField;
	}
}

//业务逻辑类
/**
 * @author ZhengYesheng
 *
 */
public class P
{
	private F f;
	
	public P(F f)
	{
		super();
		this.f = f;
	}
	
	public void action()
	{
		f.getTextField().setText("处理结果返回来了。");
	}
}
类似上面的结构,如果采用面向接口编程,会更灵活。
alan19931103 2015-11-12
  • 打赏
  • 举报
回复
搞第三个类,专门处理这种耦合。拙见

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧