【Java必会】一个保姆与两只宠物的“代理”故事(附源码)

本文介绍了Java代理模式,包括静态代理和动态代理的概念。通过实例展示了如何用代理模式控制对象的访问,如记录行为日志。文章解释了静态代理需要为每个接口手动创建代理类,而动态代理则能在运行时动态生成。动态代理的实现方式包括JDK和CGLIB,对比了两者在使用上的区别。最后讨论了代理模式的应用场景和不足之处。
摘要由CSDN通过智能技术生成

《交个朋友,绝非潘嘎之交》


文章导航:

文章目录

文章目的:
1、介绍什么是代理
2、如何理解“代理”
3、代理有哪些实现方式

#什么是代理?

在讲解Java代理之前我们先要搞明白什么是“代理”?

代理:法律上指以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。
1.短时间代人担任职务
2.受委托代表当事人进行某种活动。如:诉讼、签订合同等
3.对为别人进行诉讼的人的认可
4.代理人的职务

如果对博主上面查询到的结果有异议,一律驳回!除非你给我搬出《新华词典》!

在《head first 设计模式》中也对Java的代理模式做出了解释:

代理模式: 为另一个对象提供一个替身或占位符以控制对这个对象的访问。

所以总的来说: 代理就是控制一个对象的访问,并替被代理者进行相应的行为。

代理模式在我们生活中也是非常常见的,博主忘记在哪个论坛上看过这样一个例子,非常形象,印象很深,说的是三国时期一个非常有名的代理事件—— 曹操挟天子以令诸侯!这个故事想必大家都知道,在这个事件中,汉献帝就是被代理者,曹操就是他的代理。曹操要想代替天子做某些事情,首先就必须把天子控制起来,天子想发一道诏书,必须经过曹丞相,下面文武百官想向天子提交奏折也必须经过曹丞相,这样一来曹操就控制了天子的访问,并代替他进行了一些行为。

当然,上面那个例子只是形容了代理模式中控制对象的访问,并不是说所有的代理都是像上面那个例子一样被迫进行的。即使不是非常准确的比喻,但是我们还是可以从上面那个例子中可以提取出两个要点:
1)代理拥有被代理的控制权
2)被代理对象需要进行的操作都要经过代理对象

下面我会通过两个案例进行相关讲解:

Java代理分为静态代理和动态代理,首先我们先说一下静态代理。

#静态代理
博主呢养了两只宠物,一个小猫(Mark),一只小狗(Lucky),现在我们就从他们入手,我先创建一个动物接口,描述两只宠物的一些行为

package com.promonkey.biz;

/**
 * Created by promonkey on 2017/2/21.
 */
public interface AnimalBase {

    String eat();//吃东西

    String exercise();//运动
}

接下来就开始写两只小家伙的实现类了
小猫:

package com.promonkey.biz.impl;

import com.promonkey.biz.PetBase;

/**
 * Created by promonkey on 2017/2/21.
 */
public class Cat implements PetBase{

    private String name;
    private int age;
    private int health;

    private static Cat cat;

    //因为我只有一只小猫,所以私有化构造器,写成了单例模式
    private Cat(String name, int age, int health) {
        this.name = name;
        this.age = age;
        this.health = health;
    }

    //Mark吃鱼
    public String eat() {
        return this.name + " eat fish!";
    }

    //Mark喜欢玩球类
    public String exercise() {
        return this.name + " paly ball!";
    }

    //获得Mark对象
    public static Cat getCat() {
        if (cat == null) {
            cat = new Cat("Mark", 2, 90);
        }
        return cat;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getHealthValue() {
        return health;
    }

    /**
     * 为了方便显示出动物的一些属性值,重写了toString方法
     */
    @Override
    public String toString() {
        return "-------\n" +
                "name:" + this.getName() +
                "\nage:" + this.getAge() +
                "\nhealth:" + this.getHealthValue() +
                "\n-------";
    }
}


小狗(写法和小猫的类似):

package com.promonkey.biz.impl;

import com.promonkey.biz.PetBase;

/**
 * Created by promonkey on 2017/2/21.
 */
public class Dog implements PetBase {

    private String name;
    private int age;
    private int health;

    private static Dog lucky;

    public Dog(String name, int age, int health) {
        this.name = name;
        this.age = age;
        this.health = health;
    }

    //Lucky 吃骨头
    public String eat() {
        return getName() + " eat bone!";
    }

    //Lucky 奔跑
    public String exercise() {
        return getName() + " run!";
    }
    
    public static Dog getDog() {
        if (lucky == null) {
            lucky = new Dog("Lucky", 5, 95);
        }
        return lucky;
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值