学习代理模式之前一定要清楚一个点:什么是代理模式,即代理对象是目标对象的扩展,并且代理对象会调用目标对象。
静态代理模式在使用时,必须定义接口或者父类,并且代理对象与目标对象必须一起实现相同的接口或者继承相同的父类。
在这里,代理对象和目标对象不实现共同的接口或继承相同的父类也同样能够调用目标对象的方法,但是实现了相同的接口或继承相同的父类就能保证代理对象和目标对象有相同的约束,这样才符合代理的意义(就像买电脑,如果代理商和厂家达不成协议,代理商就无法替厂家代理)。
下面以客户买电脑为例,实现静态代理模式:
代理类和目标类都要实现的接口:
package proxy.staticProxy.proxy;
/*
* 静态代理模式
* */
public interface UserDao {
void buy(double money);
}
目标类:
package proxy.staticProxy.proxy;
public class UserDaoImpl implements UserDao {
public void buy(double money) {
System.out.println("厂家收到的货款是: " + money);
}
}
代理类:
package proxy.staticProxy.proxy;
public class UserProxy implements UserDao {
private UserDao userDao;
public UserProxy(UserDao userDao) {
this.userDao = userDao;
}
public void buy(double money) {
//代理赚取20%的利润,80%给给厂家
System.out.println("代理商赚取了20%的利润,利润总值为: " + money * 0.2);
userDao.buy(money * 0.8);
}
}
测试类:
package proxy.staticProxy.proxy;
public class Test {
public static void main(String[] args) {
//目标对象
UserDaoImpl userDao = new UserDaoImpl();
//代理对象,把目标对象传给代理对象,建立代理关系
UserProxy proxy = new UserProxy(userDao);
//执行代理方法,在代理方法中做业务处理
double money = 9000.0;
System.out.println("客户出价9000购买笔记本电脑,9000元交到代理商手里");
proxy.buy(money);
}
}
运行结果: