zoukankan      html  css  js  c++  java
  • 设计模式之代理模式

    代理模式从字面的含义上来讲就是找一个中介作为代理,对某些方法或服务进行增强,降低代码的耦合性。主要有三种代理模式

    一.静态代理:静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

    1.先创建提供服务的接口,作为源头

    package Proxy_design;
    //提供服务本体
    public interface SomeService {
        String doFirst();
        void doSecond();
    }
    

    2.实现服务接口,作为提供服务的本体

    public class SomeServiceImpl implements SomeService {
        @Override
        public String doFirst() {
            System.out.println("执行doFirst()方法");
            return "abcde";
        }
    
        @Override
        public void doSecond() {
            System.out.println("执行doSecond()方法");
        }
    }
    

    3.创建代理类,增强服务接口中的方法

    public class SomeServiceProxy implements SomeService {
        //创建代理目标对象
        private SomeService target;
    
        public SomeServiceProxy() {
            target=new SomeServiceImpl();
        }
    
        @Override
        public String doFirst() {
    //        代理类调用目标方法
            String result = target.doFirst();
    //        对目标方法进行增强
            return result.toUpperCase();
        }
    
        @Override
        public void doSecond() {
            target.doSecond();
        }
    }
    

    4.创建一个测试类

    public class MyTest {
        public static void main(String[] args) {
            SomeService someService = new SomeServiceProxy();
            String result = someService.doFirst();
            System.out.println("result=" + result);
            someService.doSecond();
        }
    }

    运行结果:

    代理类主要实现了服务接口的方法,然后通过new一个被代理类的对象,对被代理类的方法进行增强,然后在调用的时候,new一个代理类的对象,即可以调用增强后的方法。下面的图是对这整个过程底层实现的描述。首先最先进入栈的是main方法,然后调用代理类中的doFirst方法,然后再进一步调用被代理类中的doFirst方法,然后被代理类返回abcde,出栈,这时候代理类对其进行增强,然后再出栈,然后就传递给main方法,这时候就是ABCDE。

  • 相关阅读:
    web开发的性能准则(减少页面加载时间方面)
    HTTP
    HTTP -- 缓存
    新的博客地址
    mongodb 的命令操作(转)
    低调的css3属性font-size-adjust
    HTML5对表单的约束验证
    clientHeight , scrollHeight , offsetHeight之间的区别及兼容方案
    关于word-break和word-wrap的使用和区别
    MongoDB
  • 原文地址:https://www.cnblogs.com/baichendongyang/p/13235539.html
Copyright © 2011-2022 走看看