静态代理, 代理类只能够为特定的类生产代理对象,不能代理任意类
代理设计模式作用:将通用性的工作交由代理对象完成,被代理对象只需专注自己的核心业务。
- 被代理类中只用关注核心业务的实现,将通用的管理型逻辑(事务管理、日志管理)和业务逻辑分离
- 将通用的代码放在代理类中实现,提高了代码的复用性
- 通过在代理类添加业务逻辑,实现对原有业务逻辑扩展(增强)
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();
}
}