装饰者模式&代理模式
一、装饰者模式
装饰者模式,在保持原有功能不变的情况下将一个类重新装饰,使其具有更强大的功能,用一句成语形容“锦上添花”。
类结构:
Component:抽象组件,定义了一组抽象的接口,指定了被装饰的组件都有哪些功能。
ComponentImpl:抽象组件实现类,完成了基本的功能实现
Decorator:装饰器角色,持有Component的实例引用,有点递归的感觉。
伪代码:
- Component c=new ComponentImpl();
- Decorator d1=new Decorator();
- d1.setComponent(c);
- Decorator d2=new Decorator();
- d2.setComponent(d1);
- Decorator d3=new Decorator();
- d3.setComponent(d2);
- Decorator d4=new Decorator();
- d4.setComponent(d3);
- d4.methodA();
Component c=new ComponentImpl(); Decorator d1=new Decorator(); d1.setComponent(c); Decorator d2=new Decorator(); d2.setComponent(d1); Decorator d3=new Decorator(); d3.setComponent(d2); Decorator d4=new Decorator(); d4.setComponent(d3); d4.methodA();
装饰者模式和适配器模式有点类似,都是包装(wrapper)了一个类,但目地却不相同。适配器模式是将一个接口转换成另一个接口,从而达成匹配。而装饰者模式并没有改变原来的接口,而是改变原有对象的处理方法,借助递归提升性能。
二、代理模式
代理模式,为其它对象提供一种代理以控制对这个对象的访问。
类结构图:
Subject:接口类,定义了一些需要代理的接口方法
RealSubject:具体的实现类
ProxySubject:代理类,保存一个Subject引用,可以注入一个具体的子类比如RealSubject。
代理模式其实就是在操作对象时引入一定程度的间接性。这种间接性,可以增加很多附加操作。比如权限控制,参数校验等等
接口类
- /**
- * 个人信息管理
- * @author onlyone
- */
- public interface PersonManager {
- /**
- * 查询工资
- * @param name 被查人的名字
- * @param operateName 操作人名字
- */
- public double getSalary(String name,String operateName);
- }
/** * 个人信息管理 * @author onlyone */ public interface PersonManager { /** * 查询工资 * @param name 被查人的名字 * @param operateName 操作人名字 */ public double getSalary(String name,String operateName); }
具体实现类
- /**
- * 具体的实现类
- *
- * @author onlyone
- */
- public class RealPersonManager implements PersonManager {
- @Override
- public double getSalary(String name, String operateName) {
- // 查询数据库,返回具体的工资数
- return 1000000;
- }
- }
/** * 具体的实现类 * * @author onlyone */ public class RealPersonManager implements PersonManager { @Override public double getSalary(String name, String operateName) { // 查询数据库,返回具体的工资数 return 1000000; } }
代理类
- /**
- * 代理类
- *
- * @author onlyone
- */
- public class ProxyPersonManager implements PersonManager {
- // 接口引用
- PersonManager realPersonManager = new RealPersonManager();
- @Override
- public double getSalary(String name, String operateName) {
- // 1. 增加一些的权限判断。比如操作人是否有查询某人工资的权限
- // 2. 具体类的调用
- return realPersonManager.getSalary(name, operateName);
- }
- }