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。

  • 相关阅读:
    scp(secure copy)安全拷贝
    rsync 远程同步工具
    Ansible:遇到错误 "sudo: /etc/sudoers is world writable sudo: no valid sudoers sources found, quitting
    kafka数据分区的四种策略
    SwitchHosts—hosts管理利器
    HDU 2577 How to Type (字符串处理)
    HDU 1465 不容易系列之一 (错排公式+容斥)
    FZUOJ 2205 据说题目很水 (无三元环图最大边数)
    约瑟夫环问题 ( 最简单的数学解法)
    POJ 3279 Fliptile ( 开关问题)
  • 原文地址:https://www.cnblogs.com/baichendongyang/p/13235539.html
Copyright © 2011-2022 走看看