Spring與代理模式和例項工廠模式的整合使用
公司的一個專案,覺得這個設計挺有意思的,記錄下來,可能日後會用到。
只記錄了大概的一些具有代表性的程式碼,因修改過公司的包名等一些敏感性的關鍵字,可能class或者Interface有些錯誤,但不影響理解。
<!--門票類的呼叫。從這個bean入手理解設計模式 --> <bean id="aCompanyTicketInvoker" class="com.neil.util.ServiceRebootableProxy" factory-method="getInstance"> <constructor-arg index="0" ref="servicesRebootable" /> <constructor-arg index="1"> <value>com.neil.ticket.ACompanyTicketInvoker</value> </constructor-arg> </bean> <bean id="bCompanyTicketInvoker" class="com.neil.util.ServiceRebootableProxy" factory-method="getInstance"> <constructor-arg index="0" ref="servicesRebootable" /> <constructor-arg index="1"> <value>com.neil.ticket.BCompanyTicketInvoker</value> </constructor-arg> </bean>
package com.neil; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ServiceRebootableProxy implements InvocationHandler { private ServiceRebootable serviceRebootable; private Class targetClass; public void setServiceRebootable(ServiceRebootable serviceRebootable) { this.serviceRebootable = serviceRebootable; } public void setTargetClass(Class targetClass) { this.targetClass = targetClass; } public static <T> T getInstance(ServiceRebootable rebootable, Class<T> targetClass) { ServiceRebootableProxy proxy = new ServiceRebootableProxy(); proxy.setServiceRebootable(rebootable); proxy.setTargetClass(targetClass); Class[] interfaces = null; if (targetClass.isInterface()) { interfaces = new Class[] { targetClass }; } else { interfaces = targetClass.getInterfaces(); } return (T) Proxy.newProxyInstance(targetClass.getClassLoader(), interfaces, proxy); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { Object obj = serviceRebootable.get(targetClass); if (obj == null) { obj = serviceRebootable.create(targetClass); } return method.invoke(obj, args); } catch (Throwable ex) { serviceRebootable.destroy(targetClass); throw ex.getCause(); } } } <bean id="servicesRebootable" class="com.neil.util.CommonServiceRebootable"> <property name="services"> <list> <bean class="com.neil.ticket.BCompanyTicketInvoker"> <property name="url" value="${BCompany.url}" /> <property name="username" value="${BCompany.username}"/> <property name="password" value="${BCompany.password}"/> </bean> <bean class="com.neil.ticket.ACompanyTicketInvoker"> <property name="agentId" value="${ACompany.agentId}"/> <property name="secretAuthenticationKey" value="${ACompany.secretAuthenticationKey}"/> <property name="providerDomainName" value="${ACompany.providerDomainName}"/> </bean> </list> </property> </bean> ========================================== package com.neil.util; public interface ServiceRebootable { Object get(Class clazz); Object create(Class clazz); void destroy(Class clazz); } ========================================== package com.neil.util; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class CommonServiceRebootable implements ServiceRebootable { private Map<Class, Object> serviceMap = Collections.synchronizedMap(new HashMap<Class, Object>()); private List<Initializable> services; private Logger log = LoggerFactory.getLogger(this.getClass()); public void setServices(List<Initializable> services) { this.services = services; } public Object create(Class clazz) { Initializable s = find(clazz); s.init(); serviceMap.put(clazz, s); log.info(s.getClass().getCanonicalName() + "建立"); return s; } public void destroy(Class clazz) { Initializable s = (Initializable) serviceMap.remove(clazz); if (s != null) { s.destroy(); log.info(s.getClass().getCanonicalName() + "銷燬"); } } public Object get(Class clazz) { return serviceMap.get(clazz); } private Initializable find(Class clazz) { for (Initializable s : services) { if (s.getClass().equals(clazz)) { return s; } } log.error("找不到類" + clazz + "的例項"); return null; } } ========================================== package com.neil.ticket; public class ACompanyTicketInvoker extends AbstractTicketInvoker implements TicketInvoker, Initializable { private Logger log = LoggerFactory.getLogger(this.getClass()); private String agentId; private String secretAuthenticationKey; private String providerDomainName; public void init() { } /** * 預訂 */ public OrderResult buy(List<OrderParam> params) throws ServiceException { //.... return orderResult; } /** * 訂單取消 */ public BaseResult cancel(TicketRecord ticketRecord) throws ServiceException { //.... return baseResult; } /** * 訂單狀態查詢 */ public QueryOrderResult queryOrder(TicketRecord ticketRecord) throws ServiceException { //.... return queryOrderResult; } public String getProvider() { return "ACompany"; } public void destroy() { } public String getAgentId() { return agentId; } public void setAgentId(String agentId) { this.agentId = agentId; } public String getSecretAuthenticationKey() { return secretAuthenticationKey; } public void setSecretAuthenticationKey(String secretAuthenticationKey) { this.secretAuthenticationKey = secretAuthenticationKey; } public String getProviderDomainName() { return providerDomainName; } public void setProviderDomainName(String providerDomainName) { this.providerDomainName = providerDomainName; } } ========================================== package com.neil.ticket; import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class AbstractTicketInvoker implements TicketInvoker { private Map<String, AdditionalMethod> methods = new HashMap<String, AdditionalMethod>(); public abstract OrderResult buy(List<OrderParam> params) throws ServiceException; public abstract BaseResult cancel(TicketRecord ticketRecord) throws ServiceException; public abstract String getProvider(); public abstract QueryOrderResult queryOrder(TicketRecord ticketRecord) throws ServiceException; public Object query(String methodName, Object[] args) throws ServiceException { AdditionalMethod method = methods.get(methodName); if (method == null) { throw new ServiceException("沒有這個方法: " + methodName); } return method.execute(args); } public void registerMethod(String name, AdditionalMethod method) { methods.put(name, method); } } ========================================== package com.neil.util; public interface Initializable { void init(); void destroy(); } ========================================== package com.neil.ticket; import java.util.List; public interface TicketInvoker { String getProvider(); OrderResult buy(List<OrderParam> params) throws ServiceException; BaseResult cancel(TicketRecord ticketRecord) throws ServiceException; QueryOrderResult queryOrder(TicketRecord ticketRecord) throws ServiceException; Object query(String method, Object[] args) throws ServiceException; BaseResult resendVoucher(TicketRecord ticketRecord) throws ServiceException; }
相關推薦
Spring與代理模式和例項工廠模式的整合使用
公司的一個專案,覺得這個設計挺有意思的,記錄下來,可能日後會用到。 只記錄了大概的一些具有代表性的程式碼,因修改過公司的包名等一些敏感性的關鍵字,可能class或者Interface有些錯誤,但不影響理解。 <!--門票類的呼叫。從這個bean入手理解設計模式 -
工廠模式和抽象工廠模式總結與比較(屌絲專用)
屌絲有了造錢工廠,神馬都是浮雲。 工廠模式(工廠方法模式): 一個抽象Money(產品類)派生出BlueMoney、RedMoney(多個具體產品類) 一個抽象MoneyFactory(工廠類)派生出BlueMoneyFactory、MoneyFactory(多個具體工廠
工廠方法模式和簡單工廠模式的區別
簡單工廠模式 就我們的計算器例子來說,簡單工廠模式的思想就是,建立一個運算類,建立一個簡單工廠類。 運算類派生加法類、減法類、乘法類...... 簡單工廠類主要是根據傳入的符號字串,做相應的條件判斷來建立相應的運算物件。 當我們需要增加運算功能的時候,需要在運算類中派生相應的運運
簡單工廠模式、工廠模式和抽象工廠模式區別
下面例子中滑鼠,鍵盤,耳麥為產品,惠普,戴爾為工廠。 簡單工廠模式(面向單個產品,不符合開閉原則,要點:產品面向介面) 簡單工廠模式不是 23 種裡的一種,簡而言之,就是有一個專門生產某個產品的類。 比如下圖中的滑鼠工廠,專業生產滑鼠,給引數 0,生產戴爾滑鼠,給引數
走進設計模式的世界4:我不是你,但是大家都把我當成你-工廠模式和抽象工廠模式
工廠模式和抽象工廠模式: 工廠方法模式:定義了一個建立物件的介面,但由子類決定要例項化的類是哪一個。工廠方法讓類把例項化推遲到之類。 抽象工廠模式:提供一個介面,用於建立相關或以來物件的家族,而不需要明確指定具體類。 解釋:工廠方法使用繼承把物件的建立交給之類,子類實現工廠方法來建立
工廠模式和 抽象工廠模式
1:工廠模式 :就是建立一個工廠類,對實現了同一介面(Product)的一些類進行例項的建立。 優點: 1、一個呼叫者如果想建立一個物件,只要知道其名稱就可以了。 2、擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以。
策略模式和簡單工廠模式的區別
直接上程式碼: 簡單工廠模式: ------------------------------1個抽象類 --------------------------abstract class AbsClass { //抽象方法:提供一些列的演算法操作
工廠模式和抽象工廠模式以及在Android中的應用
《Android原始碼設計模式解析與實戰》第5章第6章讀書筆記 工廠方法模式介紹 工廠方法模式(Factory Pattern)建立型設計模式之一,在平時開發中或多或少都會使用它,如Android中的Activity裡的各個生命週期方法,以onC
設計模式之工廠模式和抽象工廠模式
工廠模式(Factory Pattern)的意義就跟它的名字一樣,在面向物件程式設計中,工廠通常是一個用來建立其他物件的物件。工廠模式根據不同的引數來實現不同的分配方案和建立物件。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立
java設計模式之策略模式和簡單工廠模式
簡單工廠模式:將物件交由工廠來生成。 策略模式: 主要與演算法有關。 定義了演算法家族,分別封裝起來,讓它們直接可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。 與簡單工廠模式相結合
簡單工廠模式、工廠模式和抽象工廠模式區別及優缺點
各位小夥伴好,今天給大家主要介紹一下簡單工廠模式、工廠模式和抽象工廠模式的區別及各自的優缺點。 (本文實現語言為Python3) 【前言】 眾所周知今天所講的內容是設計模式的一類;對於設計模式這個概念,我想首先請大家問問自己:1、什麼是設計模式 2、我們為什麼要了解並學習設計模式? 從我上學的時候我相信大家跟
大話設計模式中簡單工廠模式和策略模式的商場收銀軟體例項的C++程式碼
策略模式是一種定義一系統演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是具體的實現不同;策略模式可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。 策略模式是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規
Spring 實現兩種設計模式:工廠模式和單態模式
本文摘自:李剛 著 《輕量級 Java EE企業應用實戰 Struts2+Spring+hibernate整合開發》 在Spring 中大量使用的以下兩種設計模式:工廠模式和單態模式。 工廠模式可將Java 物件的呼叫者從被呼叫者的實現邏輯中分離出來,呼
代理模式和裝飾器模式的區別與聯絡
最近上javaeye,看到不少人討論java設計模式,本人只略熟悉幾種常用的設計模式,看到有人討論代理模式和裝飾器模式的區別,步驟是(poxy代理模式)1。定義一個介面2。業務類實現介面3。定義一個poxy類控制訪問實現類許可權Interface Forum{ publ
Spring實現兩種設計模式:工廠模式和單態模式
工廠模式可將Java 物件的呼叫者從被呼叫者的實現邏輯中分離出來,呼叫者只需關心被呼叫者必須滿足的規則(介面) ,而不必關心例項的具體實現過程。這是面向介面程式設計的優勢,能提高程式的解耦,避免所有的類以硬編碼方式耦合在一起。 如果所有的類直接耦合,極易形成
【設計模式】簡單工廠模式和工廠方法模式
產生 for plm nbsp osc rbm play stp mage > 簡單工廠模式 顧名思義,此模式的設計結構是簡單的,核心是生產對象。 一般來說,運用工廠模式生產的對象應該是構建對象的過程比較復雜的,獲取構建對象的過程在日後可能發生變更的。 簡單工廠
【Unity與23種設計模式】抽象工廠模式(Abstract Factory)
根據 strac 結果 產品 不同 面試 public str 構建 GoF中定義: “提供一個能夠建立整個類群組或有關聯的對象,而不必指明它們的具體類。” 意思就是 根據不同的執行環境產生不同的抽象類子類 抽象工廠模式經常在面試中會涉及到 下面的例子為工廠1和
策略模式和簡單工廠(四)
設計模式 策略模式 簡單工廠 策略模式由前端觸發決定使用某一組算法或邏輯,每一組算法或邏輯不相同,互相不幹擾。最後交由一個上下文具體去執行,並可以增加一定公有邏輯。比如某電商平臺搞活動:普通會員:滿100減10塊白銀會員:滿100減15塊 送積分黃金會員:滿100減18塊 送積分 參與抽獎鉆
代理模式和裝飾者模式的區別
並且 遞歸 http 自定義 bar sub pan 區別 產生 轉載自:http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html 學習AOP時,教材上面都說使用的是動態代理,可是在印象中代理模式一直都是
我的設計模式:工廠模式和橋梁模式
工廠模式 橋梁模式 抽象工廠模式 1.簡單工廠模式 Factory Method Pattern能生產某類(接口管理)東東,可以指定特定的類延遲初始化: 使用全局變量Map減少類的初始化過程獲取接口下的全部實現類:ClassUtils2.抽象工廠模式 Abstract Factory