爲何使用ThreadLocal模式?java
Strust2底層依賴的Servlet採用了單例模式,存在線程安全問題。爲了解決線程安全問題,常見的處理方式有兩種。第一種是採用synchronized關鍵字爲方法或者屬性加鎖,這樣能夠解決數據共享的問題;第二種是採用ThreadLoacl模式,這樣能夠使得隔離線程之間的數據。在這裏採用ThreadLoacl是由於每一次訪問都是獨立的,有些數據須要獨立起來。web
如何實現ThreadLoacl模式?windows
只須要在類中定義一個靜態的ThreadLocal 變量,並提供操做方法便可,如下是一個簡單的例子:設計模式
public class MyThreadLoacl { private static ThreadLocal<String> myHttpRequest = new ThreadLocal<String>(); public static void setMyRequest(){ myHttpRequest.set("header:"+Thread.currentThread().getId()); } public static String getMyRequest(){ return myHttpRequest.get(); } }
假設這是web容器實現HttpRequest的是一個方法。MyThreadLocal類在容器裏面是單實例的,因此就可能照成httpRequest數據的線程安全問題,可是由於每次請求都是獨立的,不須要數據之間的共享,因此這裏就能夠考慮採用ThreadLocal模式,保證了每一個線程之間都有獨立的HttpRequest。安全
爲何使用裝飾模式:ide
我也不知道啊。。。。。。。想通了再補充吧。。函數
如何實現裝飾模式?this
假設我經營了一家汽車生產企業,就叫比亞迪吧。spa
那麼我就要本身的技術規範,也就是接口線程
interface Car{ //銷售價格 double price(); }
而後我要生產一輛A型號的汽車,最終個人產品就是一個類
class CarBYD_standard implements Car{ @Override public double price() { System.out.println("CarBYD_standard,price:"); return 1000.0; } }
這樣我就生產了一輛A型號的汽車了,售價1000.0。
如今需求來了,須要生成一輛高端的汽車,產品也是一個類。
class CarBYD_luxury implements Car{ @Override public double price() { System.out.println("CarBYD_luxury,price:"); return 2000.0; } }
一輛高端的汽車就生產完畢了。
如今問題又來了。某銷售商須要我對中端和高端汽車定製一些功能。必需要真皮座椅,防彈玻璃,能夠上天能夠下海。
這個時候咱們要作的工做就是,對上面的類進行修改,可是爲了避免影響已經有的生產線,咱們確定會想到繼承,而後建立新的子類。那麼針對需求,咱們要建立多少類,咱們就須要多少工做量,多是10個,100個,1000個。。。。(手動吐血)
因此就有人總結出了一種辦法(設計模式)。
上面的例子,咱們能夠把針對汽車的個性化需求,想成一個又一個對於汽車進行的裝飾。
那麼咱們就須要一個標準的汽車模式,按照裝飾模式裏面的三要素中對應的就是被裝飾的類。
class CarBYD implements Car{ double price = 3000.0; double CarDecorationPrice = 0.0; @Override public double price() { return price + CarDecorationPrice; } }
這裏咱們有汽車成本價 price 和汽車裝飾CarDecorationPrice的價格。
而後是一個裝飾類,針對被CarBYD標準汽車進行升級改裝。
class CarProperty extends CarBYD{ Car car; List<CarDecoration> carDecorations; double CarDecorationPrice = 0.0; public CarProperty(Car car, List<CarDecoration> carDecorations) { this.car = car; for (CarDecoration carDecoration : carDecorations) { this.CarDecorationPrice += carDecoration.price(); } } @Override public double price() { return car.price() + this.CarDecorationPrice; } }
構造函數參數,car是須要被裝飾的類,carDecorations是真對car進行的升級改造
假設甲方須要真皮沙發,和防彈玻璃
interface CarDecoration { double price(); } class CarDecoration_chair implements CarDecoration{ @Override public double price() { return 1000.0; } } class CarDecoration_windows implements CarDecoration{ @Override public double price() { return 1000.0; } }
上面就是咱們企業準備好的東西,而後咱們就是須要開始升級改造了。
public class CarFactory { public static void main(String[] args) { List<CarDecoration> carDecorations = new ArrayList<CarDecoration>(); carDecorations.add(new CarDecoration_chair()); carDecorations.add(new CarDecoration_chair()); CarBYD carTemplete = new CarBYD(); Car car = new CarProperty(carTemplete, carDecorations); System.out.println(car.price()); } }
一個簡單的裝飾模式就這樣完成了。
若是之後甲方須要改造輪子,天窗等,咱們只須要編寫裝飾品,而且在不影響原來生產的狀況下知足需求。