六、静态代理分析


静态代理, 代理类只能够为特定的类生产代理对象,不能代理任意类

代理设计模式作用:将通用性的工作交由代理对象完成,被代理对象只需专注自己的核心业务

  1. 被代理类中只用关注核心业务的实现,将通用的管理型逻辑(事务管理、日志管理)和业务逻辑分离
  2. 将通用的代码放在代理类中实现,提高了代码的复用性
  3. 通过在代理类添加业务逻辑,实现对原有业务逻辑扩展(增强)

1 不使用代理

创建房东1,房东出租房子,需要做宣传,出租,签合同等系列操作。

存在的问题:

  • 房东(被代理类)很多,房子可能不一样,都要完成租房子,但是做广告,签订合同却是通用的。

  • 房东(被代理类)更关注出租房子,对于做广告,和签订合同不专业,也不关心。

  • 扩展通用的业务只能由房东改变自己的行为(修改原类的代码)。

解决的方法:

  • 房东(被代理类)只完成出租房子这一件事情。其他通用操作交由更专业的房产中介**(代理类)**完成。
  • 扩展通用的业务无须房东(被代理类)改变自己的行为,由中介(代理类)改变。也就是扩展功能时,无须修改前人已经成熟的代码
package com.yiwu.demo1;

public class Landlord1 {

    public void rentHouse(){
        advertise();
        System.out.println("出租房子");
        signContract();
    }

    public  void advertise(){
        System.out.println("做广告");
    }

    public void signContract(){
        System.out.println("签合同");
    }

}
}
import com.yiwu.demo1.Landlord1;

public class Mytest02 {
    public static void main(String[] args) {
        Landlord1 landlord1 = new Landlord1();
        landlord1.rentHouse();
    }
}

2 静态代理实现

存在问题:

  • 一个中介(代理类)只能针对一个房东(被代理类)。
  • 只能代理一个类,若存在其他被代理对象无法实现代理

第一步,修改被代理类:

package com.yiwu.demo1;

public class Landlord1 {

    public void rentHouse(){
        System.out.println("出租房子");   
    }  
}

第二步,编写代理类

package com.yiwu.demo1;

public class MyStaticProxy {

	public  Landlord1 landlord1 = new Landlord1();
    
    public void rentHouse(){
        advertise();
       landlord1.rentHouse();
        signContract();
    }


    public  void advertise(){
        System.out.println("做广告");
    }

    public void signContract(){
        System.out.println("签合同");
    }
}

第三步,编写测试类

import com.yiwu.demo1.MyStaticProxy;

public class Mytest02 {
    public static void main(String[] args) {
        MyStaticProxy myStaticProxy = new MyStaticProxy();
        myStaticProxy.rentHouse();
    }
}

3 静态代理实现改进

解决2中存在的问题。

  • 同一个中介(代理类)可以代理不同的有同样需求(用接口定义的方法)的房东(被代理类

仍然存在的问题:

  • 同一个代理类只能代理实现了某一个接口的类。

第一步,创建接口

package com.yiwu.demo1;

public interface LandlordInterface {
    public void rentHouse();
}

第二步,修改被代理类

所有被代理的类均需要实现接口

package com.yiwu.demo1;

public class Landlord1 implements LandlordInterface{

    public void rentHouse(){
        System.out.println("出租房子");
    }
}

第三步,代理类

添加构造方法,使得接口引用指向实现类对象

package com.yiwu.demo1;

public class MyStaticProxy {

    public LandlordInterface landlordInterface;

    public MyStaticProxy(LandlordInterface landlordInterface) {
        this.landlordInterface = landlordInterface;
    }

    public void rentHouse(){
        advertise();
        landlordInterface.rentHouse();
        signContract();
    }

    public  void advertise(){
        System.out.println("做广告");
    }

    public void signContract(){
        System.out.println("签合同");
    }
}

第四步,编写测试类:

  • 租客要租谁的房子,中介就代理对应的房东,由租客决定要租谁的房子,

  • 代理类具体要代理谁由调用者决定。

import com.yiwu.demo1.Landlord1;
import com.yiwu.demo1.MyStaticProxy;

public class Mytest02 {
    public static void main(String[] args) {
        MyStaticProxy myStaticProxy = new MyStaticProxy(new Landlord2());
        myStaticProxy.rentHouse();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老去的90后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值