【Java】扫盲POJO、侵入式与非侵入式,重量级与轻量级设计

POJO

使用POJO名称是为了不和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,有时可以作为value object或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

错误的认识

POJO是这样的一种“纯粹的”JavaBean,在它里面除了JavaBean规范的方法和属性没有别的东西,即private属性以及对这个属性方法的public的get和set方法。我们会发现这样的JavaBean很“单纯”,它只能装载数据,作为数据存储的载体,而不具有业务逻辑处理的能力。

真正的意思

POJO = "Plain Old Java Object",是MartinFowler等发明的一个术语,用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不但当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB, JDBC等等。

即POJO是一个简单的普通的Java对象,它包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。

非侵入式设计

一个客户端的代码可能包含框架功能和客户端自己的功能。 

侵入式设计,就是设计者将框架功能“推”给客户端,而非侵入式设计,则是设计者将客户端的功能“拿”到框架中用。 

侵入式设计有时候表现为客户端需要继承框架中的类,而非侵入式设计则表现为客户端实现框架提供的接口。 

侵入式设计带来的最大缺陷是,当你决定重构你的代码时,发现之前写过的代码只能扔掉。而非侵入式设计则不然,之前写过的代码仍有价值。 

Struts1的设计是侵入式的:

public class loginAction extends Action {
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ActionException {
		LoginForm loginForm = (LoginForm) form;
		if ("scott".equals(loginForm.getUsername() && "tiger".equals(loginForm.getPassword))) {
			return mapping.findForward("success");
		} else {
			return mapping.findForward("failure");
		}
	}
}

而webwork的设计则是非侵入的:

public class LoginAction implements Action {
	private final static String LOGINFAIL = "loginfail";
	private final static String SUCCESS = "success";
	private String passward;
	private String username;

	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}

	public String execute() throws Exception {
		if ("yeeku".equalsIgnoreCase(getUsername()) && "password".equals(getPassword)) {
			ActionContext ctx = ActionContext.getContext();
			Map session = ctx.getSession();
			session.put("username", getUsername());
			return SUCCESS;
		} else
			return LOGINFAIL;
	}
}

非侵入式设计与非侵入式

侵入式:让用户代码产生对框架的依赖,表现为用户代码需要继承框架提供的类。这些代码不能在框架外使用,不利于代码的复用。但可以使用户跟框架更好的结合,更容易,充分的利用框架提供的功能。

非侵入式:则没有过多的依赖,不需要用户代码引入框架代码的信息,从类的编写者角度来看,察觉不到框架的存在。方便的迁移到其他地方。但是与用户代码互动的方式可能就比较复杂。 

例如: 

使用struts的时候,我需要继承一些struts的类,这时struts侵入到了我的代码里。 

使用spring,编写一些业务类的时候不需要继承spring特定的类,通过配置完成依赖注入后就可以使用,此时,spring就没有侵入到我业务类的代码里。

重量级与轻量级

轻量级组件:是用JAVA代码画出来的,这样具有平台移植性

重量级组件:是调用操作系统的函数画出来的组件,比如主窗体

一般来说尽量用轻量级的组件,这样对程序的移植性很好,一般javax.swing包里的组件大部分是轻量级的java.awt里面的是重量级的。

Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏