代理
静态代理
角色分析
抽象角色(一般是接口或抽象类,是真实角色要实现的事情,比如房东租房,租房这件事)
真实角色(目标角色,比如房东要租房,房东就是目标角色,租房的人就是客户,因为要实现租房这件事,所以要实现抽象事务的接口)
代理角色(房东租房的中介,帮助真实角色实现需求,所以也要implements抽象事务)
客户(租房的人,会访问代理角色)
依旧以房东租房为例
抽象角色 租房这件事
public interface Rent {
void rent();
}
真实角色 房东 需要实现抽象角色的方法
public class host implements Rent{
@Override
public void rent() {
System.out.println("房东租房");
}
}
代理角色 与真实角色有同一个目标,也要实现抽象角色接口,并且与真实角色有联系
public class proxy implements Rent{
private host host;
public proxy(host host){
this.host=host;
}
@Override
public void rent( ) {
System.out.println("中介帮房东租房");
host.rent();
}
}
实现方式
public class test {
public static void main(String[] args) {
//在代码中每有一个房东和一个中介就要创建两个实例 开发效率低,是静态代理的缺点之一
host host = new host();
//代理角色可以在帮房东租房时与房东无关的添加附属 操作,如收取中介费等等
proxy proxy = new proxy(host);
//优点:实现了业务的分工,简化了真实角色的操作
proxy.rent();
}
}
在web框架上的应用
有一个与数据库对应的dao层,是抽象事务
public interface userDao {
void add();
void delete();
}
有一个service层 就是真实对象
public class userService implements userDao{
@Override
public void add() {
System.out.println("增加用户");
}
@Override
public void delete() {
System.out.println("删除用户");
}
}
还有一个代理对象,真实对象和代理对象都要实现userdao接口
public class userServiceimpl implements userDao{
private userService userService;
public void setUserService(com.example.rework.proxy2.userService userService) {
this.userService = userService;
}
@Override
public void add() {
System.out.println("添加");
userService.add();
}
@Override
public void delete() {
log("删除");
userService.delete();
}
public void log(String log){
System.out.println("使用了"+log+"方法");
}
}
测试类
public class userController {
public static void main(String[] args) {
userService userService = new userService();
userServiceimpl userServiceimpl = new userServiceimpl();
userServiceimpl.setUserService(userService);
userServiceimpl.add();
}
}
这就是最简单的应用了,
代理对象可以在不修改真实对象的基础下去添加新的功能,如添加的log方法,减少了代码的修改量,降低了耦合性
动态代理在下篇