设计模式之 代理模式

概述:

  代理模式(Proxy Pattern),23种常用的面向对象软件的设计模式之一。为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

组成:

  抽象角色,一般是接口,声明具体业务方法

  代理角色,实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

  真是角色(目标角色),实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

案例:

场景:你想租房子,但是找不到房子的房东,这时候通过中介来租房东的房子。

房东信息:

/**
 * 房东类
 */
public class Landlord {
    private String name;

    public Landlord(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

首先定义租赁的接口:

/**
 * 租赁接口
 */
public interface Renting {
    public void rentingHouse();
}

然后是租客和中介,都需要实现租赁接口

租客(目标角色):

/**
 * 租客类(目标类,被代理类)
 */
public class Tenant implements Renting {

    Landlord landlord;

    public Tenant(Landlord landlord) {
        this.landlord = landlord;
    }

    @Override
    public void rentingHouse() {
        System.out.println(landlord.getName() + ",我要租你的房子...");
    }
}

中介(代理角色):

/**
 * 中介代理类
 */
public class IntermediaryProxy implements Renting {

    Tenant tenant;

    public IntermediaryProxy(Landlord landlord) {
        tenant = new Tenant(landlord);
    }

    @Override
    public void rentingHouse() {
        System.out.println("中介为你服务...");
        tenant.rentingHouse();
    }
}

租赁行为(测试代码):

public class ClientClass {
    public static void main(String[] args) {
        Landlord landlord = new Landlord("张学友");
        IntermediaryProxy proxy = new IntermediaryProxy(landlord);
        proxy.rentingHouse();;
    }
}

可以看出我们的代码中,并没有出现租客的信息,因为他把租房子的行为全权让中介代理了,这也就是所说的 代理拥有目标的绝对控制权。

运行结果:

其实不难看出,代理模式和装饰模式很相似,个人理解是代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能,就这样。

原文地址:https://www.cnblogs.com/blazeZzz/p/9311319.html