文档章节

设计模式-代理模式

月夜筱风
 月夜筱风
发布于 2017/08/23 15:14
字数 659
阅读 13
收藏 0

一,概念

** 为其他对象提供一种代理以控制对这个对象的访问。**

输入图片说明

二,理解

A类和B类都继承了同一个接口(I)

表面上是访问A类,其实A类中却加载了B,且A中的实现方法都是B中的方法

做代理可以不需要动用原来的类,对其的方法进行增强,或者做前后增强

三,代码

  • 3.1目录

    输入图片说明

  • 3.2代码内容

package com.boot.lijunhao.proxy;

/**
 * PeopleProxy 和PeopleReal都是实现了这个方法
 * Created by lijunhao on 2017/8/23.
 */
public interface DoSomethingInterface {
    //接口中定义的方法
    void speak();

    void talk();

    void walk();
}
package com.boot.lijunhao.proxy;

import lombok.extern.slf4j.Slf4j;

/**
 * Created by lijunhao on 2017/8/23.
 */
@Slf4j
public class PeopleReal implements DoSomethingInterface {

    private People people;

    public PeopleReal(People people) {
        this.people = people;
    }

    @Override
    public void speak() {
        log.info("speak在类(PeopleReal.java:13)行:{}",people.getName()+"想说个话");
    }

    @Override
    public void talk() {
        log.info("talk在类(PeopleReal.java:18)行:{}",people.getName()+"想讨论个东西");
    }

    @Override
    public void walk() {
        log.info("walk在类(PeopleReal.java:23)行:{}",people.getName()+"想走路");
    }
}

package com.boot.lijunhao.proxy;

import lombok.extern.slf4j.Slf4j;

/**
 * 代理类(代理类可以对真实的类中的方法进行增强,类似于sprign的aop)
 * Created by lijunhao on 2017/8/23.
 */
@Slf4j
public class PeopleProxy implements DoSomethingInterface {


    //引入的真实的类
    private PeopleReal peopleReal;

    public PeopleProxy(People people) {
        peopleReal = new PeopleReal(people);
    }


    @Override
    public void speak() {
        log.info("speak在类(PeopleProxy.java:17)行:{}","在speak方法前做增强");
        peopleReal.speak();
        log.info("speak在类(PeopleProxy.java:22)行:{}","在speak方法后做增强");
    }

    @Override
    public void talk() {
        log.info("talk在类(PeopleProxy.java:27)行:{}","在talk方法前做增强");
        peopleReal.talk();
        log.info("talk在类(PeopleProxy.java:29)行:{}","在talk方法后做增强");
    }

    @Override
    public void walk() {
        log.info("walk在类(PeopleProxy.java:34)行:{}","在walk方法前做增强");
        peopleReal.walk();
        log.info("walk在类(PeopleProxy.java:36)行:{}","在walk方法后做增强");
    }
}

package com.boot.lijunhao.proxy;

import lombok.Data;

/**
 * Created by lijunhao on 2017/8/23.
 */
@Data
public class People {

    private String name;
}

package com.boot.lijunhao.proxy;

/**
 * Created by lijunhao on 2017/8/23.
 */
public class Start {
    public static void main(String[] args) {

        People dsd = new People();
        dsd.setName("沈强");
        //直接就隐藏掉实际的类了,只需要调用代理类就行了
        PeopleProxy peopleProxy = new PeopleProxy(dsd);
        peopleProxy.speak();
        peopleProxy.talk();
        peopleProxy.walk();
    }
}

四,结果

15:02:42.442 [main] INFO com.boot.lijunhao.proxy.PeopleProxy - speak在类(PeopleProxy.java:17)行:在speak方法前做增强
15:02:42.446 [main] INFO com.boot.lijunhao.proxy.PeopleReal - speak在类(PeopleReal.java:13)行:沈强想说个话
15:02:42.447 [main] INFO com.boot.lijunhao.proxy.PeopleProxy - speak在类(PeopleProxy.java:22)行:在speak方法后做增强
15:02:42.447 [main] INFO com.boot.lijunhao.proxy.PeopleProxy - talk在类(PeopleProxy.java:27)行:在talk方法前做增强
15:02:42.447 [main] INFO com.boot.lijunhao.proxy.PeopleReal - talk在类(PeopleReal.java:18)行:沈强想讨论个东西
15:02:42.447 [main] INFO com.boot.lijunhao.proxy.PeopleProxy - talk在类(PeopleProxy.java:29)行:在talk方法后做增强
15:02:42.447 [main] INFO com.boot.lijunhao.proxy.PeopleProxy - walk在类(PeopleProxy.java:34)行:在walk方法前做增强
15:02:42.447 [main] INFO com.boot.lijunhao.proxy.PeopleReal - walk在类(PeopleReal.java:23)行:沈强想走路
15:02:42.447 [main] INFO com.boot.lijunhao.proxy.PeopleProxy - walk在类(PeopleProxy.java:36)行:在walk方法后做增强

© 著作权归作者所有

月夜筱风
粉丝 0
博文 55
码字总数 19574
作品 0
闵行
程序员
私信 提问

暂无文章

ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
26分钟前
2
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部