欢迎光临散文网 会员登陆 & 注册

Spring学习笔记——静态动态代理

2020-07-30 08:48 作者:某个峙祁  | 我要投稿



##代理
-静态代理
-动态代理


####静态代理
角色分析:
抽象角色:一般会使用接口或者抽象类解决
真实角色:被代理的角色
代理角色:代理角色,代理真实角色后,我们一般会做一些附属操作
客户:访问代理对象的人


代码步骤:
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("中介看房子");
   }

}
```





##装饰者模式
装饰者模式 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。

  可以使用两种方式给一个类或者对象添加行为。
       一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。 
       二是使用关联。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。 
            与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象。




Spring学习笔记——静态动态代理的评论 (共 条)

分享到微博请遵守国家法律