静态代理模式
代理模式的一种,静态代理模式
静态代理采用的方式就是我们手动的将这些行为换进去,然后让编译器帮我们编译,同时也就将字节码在原有类的基础上加入一些其他的东西或者替换原有的东西,产生一个新的与原有类接口相同却行为不同的类型.
静态代理第一个例子
//租房
public interface Rent {
public void rent();
}
//房东
public class Host1 implements Rent{
@Override
public void rent() {
System.out.println("房东1出租房子");
}
}
//中介
public class Proxy implements Rent {
private Host1 host1;
public Proxy() {
}
public Proxy(Host1 host1) {
this.host1 = host1;
}
@Override
public void rent() {
host1.rent();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房");
}
}
//用户类
public class Client {
public static void main(String[] args) {
//房东要出租房子
Host1 host1 = new Host1();
//代理,中介带房东租房子,但是呢?代理一般有附加操作
Proxy proxy = new Proxy(host1);
proxy.rent();
}
}
输出:
房东1出租房子
静态代理第二个例子
//service
public interface UserService
{
public void add();
public void delete();
public void update();
public void query();
}
// 实现类
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("增加了一个用户");
}
@Override
public void delete() {
System.out.println("删除了一个用户");
}
@Override
public void update() {
System.out.println("修改了一个用户");
}
@Override
public void query() {
System.out.println("查询了一个用户");
}
//改变原有代码是大忌
}
//代理类
public class UserServiceProxy implements UserService{
private UserServiceImpl userService;
public void setUserService(UserServiceImpl userService){
this.userService = userService;
}
@Override
public void add() {
log("add");
userService.add();
}
@Override
public void delete() {
log("delete");
userService.delete();
}
@Override
public void update() {
log("update");
userService.update();
}
@Override
public void query() {
log("query");
userService.query();
}
//日志方法
public void log(String msg)
{
System.out.println("使用了"+msg+"方法");
}
}
//用户类
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
UserServiceProxy proxy = new UserServiceProxy();
proxy.setUserService(userService);
proxy.add();
}
}
输出:
使用了add方法
增加了一个用户
静态代理的优缺点
优点:
1.代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合)
2.业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
1.代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
2.代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。如上的代码是只为UserManager类的访问提供了代理,但是如果还要为其他类如Department类提供代理的话,就需要我们再次添加代理Department的代理类。