《Struts2技術內幕》讀書筆記(第四章小結(1))

ThreadLocal的使用:

爲何使用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());
	}
}

一個簡單的裝飾模式就這樣完成了。

若是之後甲方須要改造輪子,天窗等,咱們只須要編寫裝飾品,而且在不影響原來生產的狀況下知足需求。

相關文章
相關標籤/搜索