设计模式-java实现代理模式(静态代理)
代理模式是一种通过代理对象访问目标对象(被代理对象)的设计模式,它为目标对象的间接访问提供了一个解决方法,以限制直接访问目标对象。它的特点有以下几点:
- 使用代理对象将原始对象包装起来,然后用该代理对象取代原始对象。
- 任何通过对原始对象的调用都要通过代理对象调用,不能直接调用原始对象。
- 代理对象决定是否以及何时将调用转移到原始对象上。
代理模式主要涉及到三种角色,如下:
- 抽象角色:抽象角色是代理对象和真实对象共同实现的接口
- 真实角色:实现抽象接口,是我们最终要引用的对象
- 代理角色:内部含有真实的对象从而可以操作真实对象,同时代理对象实现抽象接口,所以拥有与真实对象相同的接口。以便在任何时候都可以代替真实对象,并且代理对象还可以拥有一些自己的方法,以便在操作真实对象时附加一些其他的操作,相当于对真实对象进行封装。
代理模式类图:
下面以买火车票为例子来讲解,主要涉及买票的人(真实对象),售票员(代理对象),以及他们的抽象角色(实在不知道怎么描述)
静态代理模式的实现
第一步:创建抽象角色为真实角色和代理角色提供相同的接口
/**
* 抽象角色
*
*/
public interface TrainTicket {
/**
* 买火车票
*/
void buyTrainTicket();
}
第二步:创建真实角色,在真实角色中需要实现真正的逻辑如:买票
/**
* 真实角色(想买票的人)
*/
public class People implements TrainTicket{
private String name;
public People(String name){
this.name = name;
}
/**
* 需要在真实角色中实现真正的逻辑
* 如:买了一张票
*/
@Override
public void buyTrainTicket() {
System.out.println(this.name +": 买了一张票。");
}
}
第三步:创建代理角色,在代理角色中需要持有真实角色
/**
* 代理角色(售票员)
*/
public class TicketSeller implements TrainTicket{
//代理角色中需要持有真实角色
private People people;
public TicketSeller (People people){
this.people = people;
}
/**
* 任何对真实角色的操作都要通过代理角色进行
* 并且在操作真实对象时可以添加一些额外的操作
* 如:这里的核对买票人信息,取票
*/
@Override
public void buyTrainTicket() {
//核对买票人信息
this.checkInfo();
//买票
people.buyTrainTicket();
//打印车票
this.printTicket();
}
/**
* 核对买票人信息
*/
private void checkInfo (){
System.out.println("售票员核对买票人信息。");
}
/**
* 打印车票给买票人
*/
private void printTicket (){
System.out.println("售票员打印车票给买票人。");
}
}
第4步:测试
public class Test {
public static void main(String agrs[]){
//真实对象,真正想买票的人
People people = new People("王五");
//代理对象(售票员),买票的人告诉售票员想买一张票
TicketSeller ticketSeller = new TicketSeller(people);
//买票
ticketSeller.buyTrainTicket();
}
}
运行结果为:
以上是java实现静态代理模式的方法,但是在java中运用的更多的是动态代理模式。动态代理模式需要具有加反射的知识。下面将讲解java中动态代理