public class CartViewRender { public static CartView renderMyCartView(Cart cart){ ErrorCodeEnum errorCode = null; try { cart.source = CartSource.My_Cart; CartFlowProccess.proccessMyCart(cart); } catch (TradeBaseException e) { errorCode = e.getErrorCodeEnum(); } catch(Exception e){ errorCode = ErrorCodeEnum.Cart_Error_System; } return RenderViewHelper.renderMyCartView(cart, errorCode); } public static CartView renderMobileMyCartView(Cart cart){ ErrorCodeEnum errorCode = null; try { CartFlowProccess.proccessMyCart(cart); } catch (TradeBaseException e) { errorCode = e.getErrorCodeEnum(); } catch(Exception e){ errorCode = ErrorCodeEnum.Cart_Error_System; } return RenderViewHelper.renderMyCartView(cart, errorCode); } public static CartView renderAddCartView(Cart cart){ ErrorCodeEnum errorCode = null; try { cart.source = CartSource.Add_Cart; CartFlowProccess.proccessAddCart(cart); } catch (TradeBaseException e) { errorCode = e.getErrorCodeEnum(); } catch(Exception e){ errorCode = ErrorCodeEnum.Cart_Error_System; } return RenderViewHelper.renderAddCartView(cart, errorCode); } //... }
這是一段典型的重複代碼示例,前兩個方法基本上是徹底重複的,最後一個方法則是很是的相似。先把前兩個方法改了,這個很是簡單。java
public static CartView renderMyCartViewFromNoSource(Cart cart) { ErrorCodeEnum errorCode = null; try { CartFlowProccess.proccessMyCart(cart); } catch (TradeBaseException e) { errorCode = e.getErrorCodeEnum(); } catch(Exception e){ errorCode = ErrorCodeEnum.Cart_Error_System; } return RenderViewHelper.renderMyCartView(cart, errorCode); } public static CartView renderMyCartView(Cart cart){ cart.source = CartSource.My_Cart; return renderMyCartViewFromNoSource(cart); } public static CartView renderMobileMyCartView(Cart cart){ return renderMyCartViewFromNoSource(cart); }
比較麻煩的是最後一個方法如何消除重複,在.net的世界中有delegate和lambda表達式,這個問題會比較容易搞定,而java只能用匿名類了。ide
首先觀察第三個方法與前兩個方法的不一樣之處。其實只有兩行代碼不一樣,那麼咱們只要想辦法將它們抽取出來就能夠了。spa
先聲明兩個泛型接口,用於表示兩個變化點:.net
interface Action<T> { void act(T t); } interface Func<T1,T2,T3> { T3 execute(T1 t1,T2 t2); }
而後使用這兩個接口建立一個通用方法。code
public static CartView renderCartView(Cart cart, Action<Cart> action, Func<Cart, ErrorCodeEnum, CartView> func) { ErrorCodeEnum errorCode = null; Action<Cart> cartAction = null; try { action.act(cart); } catch (TradeBaseException e) { errorCode = e.getErrorCodeEnum(); } catch (Exception e) { errorCode = ErrorCodeEnum.Cart_Error_System; } return func.execute(cart, errorCode); }
最後改寫最後一個方法的實現,因爲沒有lambda表達式,代碼看上去比較複雜些。blog
public static CartView renderAddCartView(Cart cart) { cart.source=CartSource.Add_Cart; return renderCartView(cart, new Action<Cart>() { @Override public void act(Cart cart) { CartFlowProccess.proccessAddCart(cart); } }, new Func<Cart, ErrorCodeEnum, CartView>() { @Override public CartView execute(Cart cart, ErrorCodeEnum errorCode) { return RenderViewHelper.renderAddCartView(cart, errorCode); } } ); }
若是你用了Intellj IDE,它會幫你自動作一些代碼格式化。Java8以後就能支持的更好了。接口
最後完整代碼以下:get
public class CartViewRender { public static CartView renderCartView(Cart cart, Action<Cart> action, Func<Cart, ErrorCodeEnum, CartView> func) { ErrorCodeEnum errorCode = null; Action<Cart> cartAction = null; try { action.act(cart); } catch (TradeBaseException e) { errorCode = e.getErrorCodeEnum(); } catch (Exception e) { errorCode = ErrorCodeEnum.Cart_Error_System; } return func.execute(cart, errorCode); } public static CartView renderMyCartViewFromNoSource(Cart cart) { return renderCartView(cart, new Action<Cart>() { @Override public void act(Cart cart) { CartFlowProccess.proccessMyCart(cart); } }, new Func<Cart, ErrorCodeEnum, CartView>() { @Override public CartView execute(Cart cart, ErrorCodeEnum errorCode) { return RenderViewHelper.renderMyCartView(cart, errorCode); } } ); } public static CartView renderMyCartView(Cart cart) { cart.source = CartSource.My_Cart; return renderMyCartViewFromNoSource(cart); } public static CartView renderMobileMyCartView(Cart cart) { return renderMyCartViewFromNoSource(cart); } public static CartView renderAddCartView(Cart cart) { cart.source=CartSource.Add_Cart; return renderCartView(cart, new Action<Cart>() { @Override public void act(Cart cart) { CartFlowProccess.proccessAddCart(cart); } }, new Func<Cart, ErrorCodeEnum, CartView>() { @Override public CartView execute(Cart cart, ErrorCodeEnum errorCode) { return RenderViewHelper.renderAddCartView(cart, errorCode); } } ); } //... }