代理模式

来源:互联网 发布:钢笔 知乎 编辑:程序博客网 时间:2024/06/02 07:09

代理模式

代理模式:为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理模式可以在客户端与目标对象之间起到中介的作用。

具体角色:

抽象角色(Subject):通过接口或抽象类声明真实角色实现的业务方法。
代理角色(Proxy):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑来实现抽象方法,并可附加自己的操作。
真实角色(RealSubject):实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

UML

这里写图片描述

例:

需求:

有一个追求者想要追一个女孩,给她送礼物,但是不好意思自己送,就找了个一个中间人给女生送礼物。

代码实现:

抽象角色:

 /** * 代理模式 * 抽象接口:定义送礼物的行为 * */public interface GiveGift {    void giveFlower();    void giveChocolate();}

真实角色:

/** * 代理模式 * 真实角色:追求者 * */public class Hunter implements GiveGift{    private String girlName;    public Hunter(String girlName){        this.girlName=girlName;    }    @Override    public void giveFlower() {        // TODO Auto-generated method stub        System.out.println("送给"+girlName+"花");    }    @Override    public void giveChocolate() {        // TODO Auto-generated method stub        System.out.println("送给"+girlName+"巧克力");    }}

代理角色:

/** * 代理模式 * 代理对象:追求者与被追求者的中间人 * */public class Middleman implements GiveGift {    private Hunter hunter;    public Middleman(String girlName){        if (hunter==null) {            hunter=new Hunter(girlName);        }    }    @Override    public void giveFlower() {        // TODO Auto-generated method stub        hunter.giveFlower();    }    @Override    public void giveChocolate() {        // TODO Auto-generated method stub        hunter.giveChocolate();    }}

客户端:

public class Client {    public static void main(String[] args) {        GiveGift giveGift=new Middleman("李娇娇");        giveGift.giveFlower();        giveGift.giveChocolate();    }}