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在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。
未经允许请勿转载:程序喵 » 【Java】扫盲POJO、侵入式与非侵入式,重量级与轻量级设计