1. 程式人生 > >Spring與代理模式和例項工廠模式的整合使用

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 > 簡單工廠模式 顧名思義,此模式的設計結構是簡單的,核心是生產對象。 一般來說,運用工廠模式生產的對象應該是構建對象的過程比較復雜的,獲取構建對象的過程在日後可能發生變更的。 簡單工廠

【Unity23種設計模式】抽象工廠模式(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