代理模式(一):静态代理

代理模式(一):静态代理

   在我们实际生活中代理情况无处不在。你在淘宝上面买东西,你使用支付宝平台支付,卖家请物流公司发货、你请朋友帮你拿包裹,在这个过程汇总支付宝、物流公司、你朋友都扮演者“第三者”的角色在帮你完成物品的购买,这里的第三者我们可以将其称之为代理者。
   所谓代理就通过引用一个新的对象来实现对真实对象的操作或者将新的对象当做真实对象的一个替身,这种实现的机制就是代理模式,通过引用代理对象来访问真实对象就是代理模式的设计动机。
   
   模式定义
   代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。
   在代理模式中,“第三者”代理主要是起到一个中介的作用,它连接客户端和目标对象。
   在代理模式中有如下三个角色:
   Subject: 抽象角色。声明真实对象和代理对象的共同接口。
   Proxy: 代理角色。代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。
   RealSubject: 真实角色。它代表着真实对象,是我们最终要引用的对象

静态代理

静态代理,其实质是自己手写(或者用工具生成)代理类,也就是在程序运行前就已经存在的编译好的代理类。

实现:你想送礼物,自己不好意思,让别人替你送。

创建一个实体类

/**
 * @Author: chenqi
 * @Date: 2019.9.24 09:35
 */
@Data
@AllArgsConstructor
public class Girl {
    String name;
}

创建抽象接口

/**
 * 抽象主题
 *
 * @Author: chenqi
 * @Date: 2019.9.24 09:37
 */
public interface GiveGift {

    void giveFlowers();

}

创建真实对象

/**
 * 真实对象
 *
 * @Author: chenqi
 * @Date: 2019.9.24 09:37
 */
public class Man implements GiveGift {
    Girl girl;

    public Man(Girl girl) {
        this.girl = girl;
    }

    @Override
    public void giveFlowers() {
        System.out.println(girl.name + ": give flowers!");
    }
}

创建代理对象

/**
 * 代理对象
 *
 * @Author: chenqi
 * @Date: 2019.9.24 09:49
 */
public class GirlFriend implements GiveGift {
    Man man;

    public GirlFriend(Girl girl) {
        man = new Man(girl);
    }

    @Override
    public void giveFlowers() {
        man.giveFlowers();
    }
}

创建测试类

public class Client {
    public static void main(String[] args) {
        Girl girl = new Girl("zhangsan");
        GirlFriend girlFriend = new GirlFriend(girl);
        girlFriend.giveFlowers();
    }
}
Last modification:September 24th, 2019 at 07:06 pm

Leave a Comment