设计模式之静态代理
Posted amcomputer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之静态代理相关的知识,希望对你有一定的参考价值。
一 背景
为什么叫静态代理?
因为一个角色对应一个代理,多个角色有多个代理类;
举个例子,见上图。房东是真实的角色,想去租房(定义为一个接口),我想去租房,以前是直接找房东就好了。
现在是通过代理来完成租房这件事情。
从图中可以看出,房东和代理都实现了这个接口。我只需要去找房东就好了,按照这个思路写3个类,一个接口就可以了。静态代理核心就是记住这4个角色的关系。
二 实现
2.1 写一个接口,这个接口能完成对数据库的增删改查。
package demo02;
public interface UserService {
public void add();
public void delete();
public void update();
public void find();
}
2.2 用户实现这个接口,即真实的角色
package demo02;
import org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor;
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("这里增加了一个");
}
public void delete() {
System.out.println("这里增加了一个");
}
public void update() {
System.out.println("这里增加了一个");
}
public void find() {
System.out.println("这里增加了一个");
}
}
2.3 引入一个代理,即使用组合模式
package demo02;
public class Proxy implements UserService {
public void setUser(UserServiceImpl user) {
this.user = user;
}
public UserServiceImpl user;
public Proxy() {
}
public Proxy(UserServiceImpl user) {
this.user = user;
}
public void add() {
System.out.println("这里增加了一个");
}
public void delete() {
System.out.println("这里增加了一个");
}
public void update() {
System.out.println("这里增加了一个");
}
public void find() {
System.out.println("这里增加了一个");
}
}
2.4 下面是Client ,想要去找代理,给我提供服务:
package demo02;
public class Client {
public static void main(String[] args) {
//Proxy proxy = new Proxy(new UserServiceImpl());
Proxy proxy = new Proxy();
proxy.setUser(new UserServiceImpl());
proxy.add();
}
}
Client 直接去找proxy ,以后想增加其他功能,如打印日志,直接在Proxy中增加即可,不用改变原来的UserServiceImpl类,这就是静态代理的好处。缺点是每个真实的角色都需要对应一个代码。动态代理完美的解决了这个问题,可以看笔者另外一篇,设计模式之动态代理,动态代理是AOP的核心,也是注解实现的核心基础,对于web开发人员,掌握这个知识点很重要。
以上是关于设计模式之静态代理的主要内容,如果未能解决你的问题,请参考以下文章