《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());
	}
}

一个简单的装饰模式就这样完成了。

若是之后甲方须要改造轮子,天窗等,咱们只须要编写装饰品,而且在不影响原来生产的状况下知足需求。

相关文章
相关标签/搜索