设计模式之静态代理

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开发人员,掌握这个知识点很重要。

以上是关于设计模式之静态代理的主要内容,如果未能解决你的问题,请参考以下文章

Spring之静态/动态代理模式

设计模式之代理模式-静态代理

Java设计模式-代理模式之动态代理(附源代码分析)

#yyds干货盘点# 设计模式之代理模式:静态代理

Java之静态代理模式

代理设计模式之静态代理与动态代理(超..)详解