文章导航:
文章目录
文章目录
文章目的:
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;