为何使用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()); } }
一个简单的装饰模式就这样完成了。
若是之后甲方须要改造轮子,天窗等,咱们只须要编写装饰品,而且在不影响原来生产的状况下知足需求。