快速判断想控制能不能调用权限、延迟创建→代理想给对象叠加额外功能可以自由多层套 →装饰器核心区分代理模式控制访问代理对象代替原始对象干活可以做权限、日志、延迟加载控制访问装饰器模式动态增强功能给原有对象叠加额外行为不控制访问只是加附加逻辑。两者结构非常像都包装目标对象实现同一个接口但是意图完全不同。1. 代理模式Proxy Pattern意图为目标对象提供一个代理对象由代理控制对目标对象的访问。 常见类型静态代理、动态代理 (JDK/CGLIB)、远程代理、虚拟代理。适用场景权限控制访问目标对象前校验登录 / 权限无权限直接拦截不调用真实对象延迟加载虚拟代理大对象图片、重型服务需要的时候才创建真实对象远程代理访问远程服务RPC代理封装网络调用细节日志 / 埋点次要但重点是代理接管访问入口特点代理类和目标类是一对一一般提前确定代理谁不能随意多层叠加。Java 静态代理示例// 统一接口 public interface UserService { void addUser(); } // 真实对象 public class UserServiceImpl implements UserService { Override public void addUser() { System.out.println(【真实对象】新增用户); } } // 代理对象控制访问 public class UserServiceProxy implements UserService { // 持有真实对象 private UserService target; public UserServiceProxy(UserService target) { this.target target; } Override public void addUser() { // 代理访问控制权限校验 System.out.println(【代理】校验权限); if (checkPermission()) { target.addUser(); // 通过校验才访问真实对象 System.out.println(【代理】操作后记录日志); } else { System.out.println(【代理】权限不足禁止访问); } } private boolean checkPermission() { return true; } } // 测试 public class TestProxy { public static void main(String[] args) { UserService target new UserServiceImpl(); UserService proxy new UserServiceProxy(target); proxy.addUser(); } }输出【代理】校验权限 【真实对象】新增用户 【代理】操作后记录日志典型业务Spring AOP 底层就是动态代理用来拦截方法做事务、权限。2. 装饰器模式Decorator Pattern意图动态给对象增加额外职责不需要修改原类。装饰器本身也实现同一个接口可以多层嵌套叠加。核心包装后原有对象能力增强不是控制访问。适用场景IO 流BufferedReader装饰FileReader、DataOutputStream装饰FileOutputStream经典案例咖啡订单基础咖啡可以动态加牛奶、糖、巧克力任意组合叠加UI 组件窗口可以动态增加滚动条、边框特点可以无限多层装饰叠加装饰器的目的是扩展功能不是拦截访问。Java 示例咖啡// 公共抽象组件 public abstract class Coffee { public abstract String getDesc(); public abstract double getPrice(); } // 基础对象美式咖啡 public class Americano extends Coffee { Override public String getDesc() { return 美式咖啡; } Override public double getPrice() { return 15; } } // 装饰器抽象类继承Coffee持有Coffee对象 public abstract class CoffeeDecorator extends Coffee { protected Coffee coffee; public CoffeeDecorator(Coffee coffee) { this.coffee coffee; } } // 具体装饰器加牛奶 public class MilkDecorator extends CoffeeDecorator { public MilkDecorator(Coffee coffee) { super(coffee); } Override public String getDesc() { return coffee.getDesc() 牛奶; } Override public double getPrice() { return coffee.getPrice() 3; } } // 具体装饰器加糖 public class SugarDecorator extends CoffeeDecorator { public SugarDecorator(Coffee coffee) { super(coffee); } Override public String getDesc() { return coffee.getDesc() 糖; } Override public double getPrice() { return coffee.getPrice() 1; } } // 测试 public class TestDecorator { public static void main(String[] args) { // 基础咖啡 牛奶 糖多层嵌套装饰 Coffee coffee new Americano(); coffee new MilkDecorator(coffee); coffee new SugarDecorator(coffee); System.out.println(coffee.getDesc() 价格 coffee.getPrice()); } }输出美式咖啡 牛奶 糖价格19.03. 对比总结表维度代理模式装饰器模式核心意图控制 / 管理对目标对象的访问动态增强对象功能叠加附加行为组合关系代理包装目标一般一对一很少多层嵌套装饰器可以无限多层嵌套自由组合新增能力代理本身不新增业务能力只是拦截、校验、转发装饰器新增功能缓冲、配料典型案例Spring AOP 动态代理、RPC 远程代理Java IO 流、咖啡配料使用者视角使用者拿到代理感知不到真实对象存在使用者依然操作原对象一层一层叠加增强