真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

[設計模式]代理模式、適配器模式與裝飾器模式

代理模式、適配器模式與裝飾器模式

這三種設計模式在代碼形式上十分相似。但是為了解決不同的問題而提出的:

成都創(chuàng)新互聯(lián)公司專注于定南企業(yè)網站建設,響應式網站設計,商城網站建設。定南網站建設公司,為定南等地區(qū)提供建站服務。全流程按需定制制作,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務

  • 代理模式
    • 代理模式在不改變原始接口的條件下,為原始類控制訪問、新增一些業(yè)務無關的功能。
  • 適配器模式
    • 將不兼容的接口轉換為可兼容的接口。(一種以修正為目的的設計模式)。
  • 裝飾器模式
    • 裝飾器模式是對原始類的功能進行增強,支持多個裝飾類的嵌套增強。

代理模式

???? 代理模式主要有兩種實現(xiàn),一種是靜態(tài)代理,需要與被代理類實現(xiàn)相同的接口。也可以使用java提供的反射機制,進行靈活的動態(tài)代理

靜態(tài)代理

  • 基于接口,若被代理類有接口,那么通常我們的代理類會實現(xiàn)與之一樣的接口,注入被代理類,并在實現(xiàn)時,對被代理類進行增強。
  • 基于繼承,有些被代理類并沒有接口,因此只能使用繼承的方式進行擴展。

動態(tài)代理

靜態(tài)代理的問題: 當我們有非常多實現(xiàn)了不同接口的類需要被代理的時候,靜態(tài)代理的方式就顯得非常麻煩。我們需要給每個被代理類實現(xiàn)相同的代理邏輯,但代碼大多數都是重復的,我們可以使用反射進行動態(tài)代理來解決這一問題。

動態(tài)代理Java實現(xiàn)

我們需要實現(xiàn)InvocationHandler 接口。

private class DynamicProxyHandler implements InvocationHandler {
	private Object proxiedObject;
	public DynamicProxyHandler(Object proxiedObject) {
		this.proxiedObject = proxiedObject;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Th
		long startTimestamp = System.currentTimeMillis();
		Object result = method.invoke(proxiedObject, args);
		long endTimeStamp = System.currentTimeMillis();
		long responseTime = endTimeStamp - startTimestamp;
		String apiName = proxiedObject.getClass().getName() + ":" + method.getNam
		RequestInfo requestInfo = new RequestInfo(apiName, responseTime, startTim
		metricsCollector.recordRequest(requestInfo);
		return result;
	}
}

實現(xiàn)完成后,將這個實現(xiàn),以及被代理類的類加載器、被代理類的接口一同傳入Proxy類的靜態(tài)方法newProxyinstance中,就可以動態(tài)的創(chuàng)建代理類了。

public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

代理模式的應用

  1. 非業(yè)務邏輯的剝離
    1. 對于日志、緩存讀寫、性能統(tǒng)計等非業(yè)務邏輯相關的代碼,可以使用統(tǒng)一的代理類進行管理。
  2. RPC框架消費者調用時
    1. RPC調用時,作為消費方,之所以能像調用本地方法一樣調用服務端的遠程方法,是因為這里使用代理模式為我們屏蔽了服務提供方尋址、請求序列化、結果反序列化等過程。

適配器模式

???? 適配器模式可以基于類實現(xiàn),也可以基于對象實現(xiàn)?;陬悓崿F(xiàn)使用繼承的方式進行實現(xiàn),而基于對象則是用組合的形式實現(xiàn)。

基于類

簡單來說,就是定義一個適配器接口,并繼承需要被適配的類,然后實現(xiàn)適配器接口的相應方法。在實現(xiàn)接口的方法時,我們只需要實現(xiàn)那些需要被改造的舊接口,對于符合要求的舊接口,可以繼續(xù)沿用父類方法。(因此,如果需要適配的對象接口很多,并且和新接口定義大部分都相同,那么可以直接使用基于類的實現(xiàn))

基于實現(xiàn)

基于實現(xiàn)的方法,是將被適配的類注入進來,再進行相應改造的方式。相較基于類的方式,更靈活。如果新舊接口存在較多的不一致,推薦使用基于實現(xiàn)的方式,會更加靈活。

使用場景

  1. 封裝舊系統(tǒng)的api
    1. 方法名稱語義不清晰?
    2. 參數過多?
    3. 性能過低?
  2. 替換外部依賴
  3. 兼容老版本

實際應用

比如slf4j就是一套統(tǒng)一不同底層日志包的接口。此外,考慮到不同日志包的api存在的不同,slf4j還提供了相應的適配器,來統(tǒng)一api管理。

裝飾器模式

???? 裝飾器模式一般使用基于實例的方式,具有更好的擴展性。但同時,裝飾器模式一般還會繼承與原始類相同的父類,可以達到嵌套增強的目的。
當前名稱:[設計模式]代理模式、適配器模式與裝飾器模式
當前網址:http://weahome.cn/article/dscgipo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部