设计模式-java实现代理模式(静态代理)

设计模式-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中动态代理

猜你喜欢

转载自blog.csdn.net/hubin916/article/details/78192897