目录
简介:
主要结构:
静态代理代码准备:
公共接口:
目标类:
代理类:
运行测试:
静态代理模式优缺点
简介:
1.代理模式是为其他对象提供一种代理以控制对这个对象的访问。
2.代理对象可以在客户端和目标对象之间起到中介的作用,
3.通过代理对象,客户端可以间接访问目标对象
4.代理对象可以在访问目标对象前后执行一些额外的操作(新增)。
主要结构:
- 抽象主题(Subject)接口:代理对象和目标对象的共同接口。这个很重要,他俩要实现同一个接口
- 真实主题(Real Subject)类(目标对象):定义了代理所代表的真实对象,实现了抽象主题接口,包含了具体的业务逻辑。
- 代理(Proxy)类(代理对象):实现了抽象主题接口,持有一个真实主题的引用(其中有目标对象的声明),在客户端调用抽象主题接口中的方法时。
静态代理代码准备:
公共接口:
java">public interface Service{void add();void delete();void update();void query();
}
目标类:
java">
public class ServiceImpl implements Service{@Overridepublic void add() {System.out.println("add...");}@Overridepublic void delete() {System.out.println("delete...");}@Overridepublic void update() {System.out.println("update...");}@Overridepublic void query() {System.out.println("query...");}
}
代理类:
在这里我新增了一个计算程序运行时长的功能
java">public class ServiceProxy implements Service{//将目标对象作为代理对象的一个属性,这样比继承的欧俄厚度低private Service target=null;//这就是OrderService//创建代理对象的时候传一个public OrderServiceProxy(OrderService target) {this.target = target;}@Overridepublic void add() {//代理方法//新增long begin = System.currentTimeMillis();//对象的的目标方法target.add();//新增long end = System.currentTimeMillis();System.out.println((end - begin) + "ms");}@Overridepublic void delete() {//代理方法//新增long begin = System.currentTimeMillis();target.modify();//新增long end = System.currentTimeMillis();System.out.println((end - begin) + "ms");}@Overridepublic void update() {//代理方法long begin = System.currentTimeMillis();target.update();long end = System.currentTimeMillis();System.out.println((end - begin) + "ms");}@Overridepublic void query() {//代理方法//新增long begin = System.currentTimeMillis();target.query();//新增long end = System.currentTimeMillis();System.out.println((end - begin) + "ms");}}
运行测试:
java">public class Test {public static void main(String[] args) {//创建目标对象Service target = new ServiceImpl();//创建代理对象并传入目标对象Service ServiceProxy = new ServiceProxy(target);//调用代理ServiceProxy.generate();ServiceProxy.modify();ServiceProxy.detali();}
}
静态代理模式优缺点
优点:
1.新增功能时遵守了ocp开闭原则
2.使用关联关系将目标对象注入代理对象,大大减小了代码的耦合度
缺点:
一个代理对象只能管理一个目标对象,要是目标对象多了这很容易形成类爆炸