• 设计模式——代理模式


    基本原理:

    //源接口

    public interface Sourceable {
         public void method();
    }

    //实现接口类

    public class Source implements Sourceable{
         @Override
         public void method() {
             // TODO Auto-generated method stub
             System.out.println("源方法");
         }
    }

    //代理对象实现类——将实现类 封装到 代理实现类,同时实现同一个接口

    public class Proxy implements Sourceable{
         private Sourceable source;
         public Proxy(Sourceable source) {
             this.source = source;
         }
         @Override
         public void method() {
             // TODO Auto-generated method stub
             System.out.println("before invoke");
             source.method();
             System.out.println("after invoke");
         }
    }

    //测试

    public class Demo {
         public static void main(String[] args) {
             new Proxy(new Source()).method();
         }
    }


    综合案例:

    //接口

    public interface UserDao {
    void save(User user);
    void delete();
    }
    //存储User对象
    public class User {
    private String name;
    private Integer age;
    public User(){
    super();
    }
    public User(String name,Integer age){
    this.name = name;
    this.age = age;
    }
    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public Integer getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }

    @Override
    public String toString(){
    StringBuilder tmp = new StringBuilder();
    tmp.append(name);
    tmp.append(",");
    tmp.append(age);
    return tmp.toString();
    }
    }

    业务层:UserService

    //直接调用

    public static void directCall(){
    User user = new User();
    user.setName("macro");
    user.setAge(25);
    //内名内部类实现
    UserDao userDao = new UserDao() {
    @Override
    public void save(User user) {
    //入库,打印信息(简单不限制输入内容)
    System.out.println("保存用户信息:"+user.toString());
    }
    @Override
    public void delete() {
    }
    };
    userDao.save(user);
    User user1 = new User("",20);
    User user2 = new User("小海",-10);
    userDao.save(user1);
    userDao.save(user2);
    }

    静态代理——跟杨老师的Dao、Serivice、Controller 等吻合!

    //将接口实现类封装到代理对象中

    //接口实现类

    public class UserDaoImpl implements UserDao{

    @Override
    public void save(User user) {
    //入库
    //初始判断条件简单
    if(user.getName()==null || user.getName().length()<=0){
    System.out.println("用户名输错");
    return;
    }
    if(user.getAge() == null || user.getAge().intValue()<0){
    System.out.println("用户年龄输错");
    return;
    }
    System.out.println("入库用户信息:"+user.toString());
    }

    @Override
    public void delete() {
    System.out.println("执行删除操作");
    }
    }

    //代理对象

    public class StaticProxyUser implements UserDao {
    private UserDao target;
    public StaticProxyUser(UserDao userDao){
    this.target = userDao;
    }
    //增加参数校验
    @Override
    public void save(User user) {
    //增加判断条件
    if(user.getName()==null || user.getName().length()<=0){
    System.out.println("用户名称输错,入库失败");
    return;
    }
    if (user.getAge()<0 ||user.getAge()>200){
    System.out.println("用户年龄输错,入库失败");
    return;
    }
    //调用原来的对象入库等操作
    target.save(user);
    //System.out.println(user.toString());
    }

    @Override
    public void delete() {

    }
    }

    //调用

    public static void staticProxyCall(){
    UserDaoImpl userDaoImpl = new UserDaoImpl();
    StaticProxyUser staticProxyUser = new StaticProxyUser(userDaoImpl);
    User user = new User();
    user.setName("macro");
    user.setAge(25);
    staticProxyUser.save(user);
    user.setName("小海");
    user.setAge(-1);
    staticProxyUser.save(user);
    User user1 = new User("",3);
    staticProxyUser.save(user1);
    }


    JDK代理——缺少理论理解???

    //实现Invocationhandler接口

    public class UserInvocaHandler implements InvocationHandler {
    public Object object;
    public UserInvocaHandler(Object object){
    this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //return null;
    System.out.println("开始执行JDKProxy");
    //添加限制条件
    if(args != null && args.length==1){
    if(args[0] instanceof User){
    User user = (User) args[0];
    if (user.getName() == null || user.getName().trim().length()<=0 ){
    System.out.println("姓名为空,不保存");
    return false;
    }
    if (user.getAge() == null || user.getAge()<0 ){
    System.out.println("年龄小于0,不保存");
    return false;
    }
    }
    }
    Object result = method.invoke(object,args);
    System.out.println("执行结束JDKProxy");
    return result;
    }
    }
    //调用过程
    public static void jdkProxy(){
    User user = new User("macro",26);
    UserDaoImpl userDao = new UserDaoImpl();
    UserInvocaHandler handler = new UserInvocaHandler(userDao);
    //UserDao 必须是接口
    UserDao userDao1 = (UserDao) Proxy.newProxyInstance(
    userDao.getClass().getClassLoader(),
    userDao.getClass().getInterfaces(),
    handler
    );
    //System.out.println("开始执行JDKProxy");
    userDao1.save(user);
    //System.out.println("执行结束JDKProxy");

    User user1 = new User("macro1",-6);
    User user2 = new User("",26);
    userDao1.save(user1);
    userDao1.save(user2);
    userDao1.delete();
    }

    Cglib代理

    //同样:实现 MethodInterceptor接口

    public class User2DaoCglibProxy implements MethodInterceptor {
    private Object object;
    public User2DaoCglibProxy(Object object){
    this.object = object;
    }
    public Object getProxyInstance() {
    Enhancer en = new Enhancer();
    en.setSuperclass(object.getClass());
    en.setCallback(this);
    return en.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    System.out.println("开始执行");
    Object result = method.invoke(object,objects);
    System.out.println("结束执行");
    return result;
    //return null;
    }

    /*@Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    return null;
    }*/
    }
    //调用该代理方法
    public static void cglibProxy(){
    User user = new User("macro",26);
    User2Dao user2Dao = new User2Dao();
    //UserInvocaHandler handler = new UserInvocaHandler(userDao);
    User2DaoCglibProxy cglibProxy = new User2DaoCglibProxy(user2Dao);
    User2Dao user2DaoProxy = (User2Dao) cglibProxy.getProxyInstance();

    user2DaoProxy.save(user);
    User user1 = new User("",26);
    user2DaoProxy.save(user1);
    User user12 = new User("hr",-6);
    user2DaoProxy.save(user12);
    }

    动态代理,是代替实现类的实现,没有真正的实现类

  • 相关阅读:
    TP3.2框架,实现空模块、空控制器、空操作的页面404替换||同步实现apache报错404页面替换
    调用支付宝PHP接口API实现在线即时支付功能(UTF-8编码)
    JQuery实现的 checkbox 全选;<select>下拉框功能
    使用PHP做移动端 api接口开发方法(适用于TP框架)
    Eclipse jvm启动参数在哪设置
    对 META标签 的一点点了解
    Java反射在整个程序运行中的位置
    Java 为什么要使用反射(通俗易懂的举例)
    粗略介绍Java AQS的实现原理
    Java并发包中线程池的种类和特点介绍
  • 原文地址:https://www.cnblogs.com/macro-renzhansheng/p/12536496.html
Copyright © 2020-2023  润新知