1. 静态代理模式:
package proxy;
/**
* room工厂
* roomSize:房子的大小
* roomPrice:房子的价格
*/
interface RoomFactory{
void roomSize();
void roomPrice();
}
/**
* 被代理类,人要买房子
*/
class PersonRoom implements RoomFactory{
@Override
public void roomSize() {
System.out.println("我想要150平米");
}
@Override
public void roomPrice() {
System.out.println("我期望的价格是150万");
}
}
class AgentRoom implements RoomFactory{
private RoomFactory personroom;
//用被代理类对象进行实例化
public AgentRoom(RoomFactory personroom){
this.personroom=personroom;
}
@Override
public void roomSize() {
System.out.println("所有房子最小为:100");
personroom.roomSize();
System.out.println("所有房子最大为:200");
}
@Override
public void roomPrice() {
System.out.println("所有房子最便宜为:100万");
personroom.roomPrice();
System.out.println("所有房子最贵为:500万");
}
}
public abstract class staticProxyTest{
public static void main(String[] args) {
PersonRoom personRoom = new PersonRoom();
AgentRoom agentRoom = new AgentRoom(personRoom);
agentRoom.roomSize();
System.out.println();
agentRoom.roomPrice();
}
}
运行结果
proxy.staticProxyTest
所有房子最小为:100
我想要150平米
所有房子最大为:200
所有房子最便宜为:100万
我期望的价格是150万
所有房子最贵为:500万
Process finished with exit code 0
2. 动态代理模式:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Human{
String getBelief();
void eat(String food);
}
/**
* 被代理类
*/
class superman implements Human{
@Override
public String getBelief() {
return "我要拯救世界";
}
@Override
public void eat(String food) {
System.out.println("我爱吃"+food);
}
}
/**
* 要想实现动态代理,需要解决的问题:
* 1、如何根据被加载到内存的被代理类,动态创建一个代理类及其对象
* 2、当通过代理类的对象调用方法时,如何动态的去调用被代理类的同名方法
*/
//这里没有代理类对象,而是根据被代理类对象动态生成代理类对象
class proxyFactory{
//调用此方法创建代理类的对象,解决问题一
public static Object getproxyInstance(Object obj){//obj:被代理类的对象
MyInvocationHandler handler=new MyInvocationHandler();
handler.band(obj);
/**
* 返回和被代理类相同的加载器,接口,同名方法的代理类对象
*/
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
}
}
class MyInvocationHandler implements InvocationHandler{
//需要使用被代理类的对象进行对obj赋值
private Object obj;
public void band(Object obj){
this.obj=obj;
}
//当我们通过代理类的对象,调用被代理类的a方法时,就会自动调用如下方法invoke()
//被代理类要执行的方法a的功能就声明在invoke中
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method:即为代理类对象调用的方法,此方法也就作为被代理类要调用的方法
//obj:被代理类的对象
Object methodValue = method.invoke(obj,args);
return methodValue;
}
}
public class dynamicProxyTest{
public static void main(String[] args) {
superman superman = new superman();
//编译的时候动态生成代理类对象
Human factoryInstance = (Human) proxyFactory.getproxyInstance(superman);
//当调用代理类对象方法时,会自动调用被代理类中的同名方法
String str=factoryInstance.getBelief();
System.out.println(str);
factoryInstance.eat("面包");
System.out.println("******************************");
PersonRoom personRoom = new PersonRoom();
//编译的时候动态生成代理类对象
RoomFactory roomInstance = (RoomFactory) proxyFactory.getproxyInstance(personRoom);
roomInstance.roomSize();
roomInstance.roomPrice();
}
}
运行结果
proxy.dynamicProxyTest
我要拯救世界
我爱吃面包
******************************
我想要150平米
我期望的价格是150万
Process finished with exit code 0