Spring学习笔记——静态动态代理
##代理
-静态代理
-动态代理
####静态代理
角色分析:
抽象角色:一般会使用接口或者抽象类解决
真实角色:被代理的角色
代理角色:代理角色,代理真实角色后,我们一般会做一些附属操作
客户:访问代理对象的人
代码步骤:
1.接口
```java
public interface Rent {
public void rent();
}
```
2.真实角色
```java
public class Host implements Rent{
public void rent() {
System.out.println("房东租房");
}
}
```
3.代理角色
```java
public class Proxy implements Rent {
private Host host;
public Proxy(){
}
public Proxy(Host host){
this.host=host;
}
public void rent() {
seeHouse();
hetong();
fare();
host.rent();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房 ");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
//签合同
public void hetong(){
System.out.println("签合同");
}
}
```
4.客户端访问代理角色
```java
public class Client {
public static void main(String[] args) {
Host host = new Host();
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
```
代理模式的好处:
可以使真实角色操作更加纯粹,不用去关注一些公共业务
公共也就交给代理角色,实现了业务分工
公共业务发生扩展的时候,方便集中管理
缺点:
一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低。
####动态代理
-动态代理和静态代理角色一样
-动态代理的代理类是动态生成的,不是直接写好的
-动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口--jdk动态代理
基于类:cglib
java字节码实现:javasist
-需要了解的两个类proxy :代理 , lnvocationHandler :调用处理程序
```java
public class ProxyInvocationHandler implements InvocationHandler {
public Object target;
//set构造方法
public void setTarget(Object target) {
this.target = target;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//处理代理实例并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seehous();
//动态代理的本质,就是使用反射机制实现
return method.invoke(target, args);
}
public void seehous(){
System.out.println("中介看房子");
}
}
```
##装饰者模式
装饰者模式 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。
可以使用两种方式给一个类或者对象添加行为。
一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。
二是使用关联。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。
与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象。