前言
工作中实际遇到最多的是责任链模式,相对而言装饰者模式用的较少。
责任链模式比较常见就是各种filter和各种intercepet。还比如activiti流程引擎框架中也使用了责任链+命名的设计模式
一、责任链模式
责任链负责将把所有处理类方法串联起来,挨个进行处理
下面举例子:
1.1 类图
举个例子,按照如下类图进行开发
1.2 代码
IInterceptor
public interface IInterceptor {
boolean process(String msg);
}
TokenInterceptor
public class TokenInterceptor implements IInterceptor {
@Override
public boolean process(String msg) {
if (msg.contains("token")) {
System.out.println("拦截处理token");
return true;
}
return false;
}
}
ParamInterceptor
public class ParamInterceptor implements IInterceptor {
@Override
public boolean process(String msg) {
if (msg.contains("非法字符")) {
System.out.println("拦截处理非法字符");
return true;
}
return false;
}
}
ChainInterceptor
后面还可以将这个chain传如另一个ChainInterceptor进行迭代,因为ChainInterceptor本身也是IInterceptor
public class ChainInterceptor implements IInterceptor {
LinkedList<IInterceptor> list = new LinkedList<>();
public ChainInterceptor() {
list.add(new TokenInterceptor());
list.add(new ParamInterceptor());
}
@Override
public boolean process(String msg) {
for (IInterceptor interceptor : list) {
if (interceptor.process(msg)) {
//中间有一个处理拦截了;
//后面就不需要在遍历处理
return true;
}
}
return false;
}
}
测试:Main
public class Main {
public static void main(String[] args) {
ChainInterceptor chain = new ChainInterceptor();
String msg = "反倒是token都is哈佛了";
chain.process(msg);
}
}
二、装饰者模式
装饰者模式,见名知义,给某个物体增加修饰。比如要给汽车加上翅膀,再加上炮弹
2.1 类图
2.2 代码
Vehicle
public abstract class Vehicle {
abstract void run();
}
Car
public class Car extends Vehicle {
@Override
void run() {
System.out.println("汽车四个轮子 go~~~");
}
}
VehicleDecorator
public abstract class VehicleDecorator extends Vehicle {
public Vehicle vehicle;
public VehicleDecorator(Vehicle vehicle) {
this.vehicle = vehicle;
}
}
CarWingDecorator
public class CarWingDecorator extends VehicleDecorator {
public CarWingDecorator(Vehicle vehicle) {
super(vehicle);
}
@Override
void run() {
super.vehicle.run();
System.out.println("car加上理想的翅膀 sososo~~~~");
}
}
CarGanDecorator
public class CarGanDecorator extends VehicleDecorator {
public CarGanDecorator(Vehicle vehicle) {
super(vehicle);
}
@Override
void run() {
super.vehicle.run();
System.out.println("car加上炮弹hong hong~~~~~");
}
}
测试
Main
public class Main {
public static void main(String[] args) {
CarGanDecorator decorator = new CarGanDecorator(new CarWingDecorator(new Car()));
decorator.run();
}
}