设计模式---代理模式

代理模式

代理模式(Proxy) :为其他对象提供一种代理以控制对这个对象的访问

举个例子来理解,假设XXXX高中学校,小张暗恋隔壁班的小红,但小张由于内向,不敢去表白,于是找到与小红同班的好哥们–小明,让小明帮帮小张带个口信去表白…
综上总结:小张(追求者)、小红(被追求者)、小明(代理)

具体如下:

1、没有代理的代码
在这里插入图片描述

/**
 *  没有代理的代码
 *	追求者
 */
public class XiaoZhang {
    SchoolGirl mm;

    public XiaoZhang (SchoolGirl mm) {
        this.mm = mm;
    }

    public void GiveKouHong(){
        System.out.println(mm.getName() + "送你口红");
    }

    public void GiveFlowers(){
        System.out.println(mm.getName() + "送你鲜花");
    }

    public void GiveChocolate(){
        System.out.println(mm.getName() + "送你巧克力");
    }
}
/**
 * 被追求者
 */
public class SchoolGirl {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
/**
 * 没有代理的代码
 */
    @Test
   public void demo1(){
        SchoolGirl xiaohong = new SchoolGirl();
        xiaohong.setName("小红");

        XiaoZhang xiaozhang = new XiaoZhang (xiaohong);

        xiaozhang.GiveChocolate();
        xiaozhang.GiveKouHong();
        xiaozhang.GiveFlowers();
    }

没有代理的代码就变成了,小张直接送礼物给小红,但此时小红不认识小张,所以不能这么写

2、只有代理的代码
在这里插入图片描述

/**
 *   只有代理的代码
 */
public class Peoxy {
    SchoolGirl mm;

    public Peoxy(SchoolGirl mm) {
        this.mm = mm;
    }

   public void GiveKouHong(){
        System.out.println(mm.getName() + "送你口红");
    }

    public void GiveFlowers(){
        System.out.println(mm.getName() + "送你鲜花");
    }

    public void GiveChocolate(){
        System.out.println(mm.getName() + "送你巧克力");
    }
}
/**
 * 只有代理的代码
 */
    @Test
    public void demo2(){
       	SchoolGirl xiaohong = new SchoolGirl();
        xiaohong.setName("小红");

        Peoxy peoxy  = new Peoxy(xiaohong);

        peoxy.GiveChocolate();
        peoxy.GiveKouHong();
       	peoxy.GiveFlowers();
    }

只有代理的代码就变成了,小明直接送礼物给小红,但此时是小张向小红表白,而不是小明,所以不能这么写

3、符合实际的代码
在这里插入图片描述

/**
 *	接口
 */
public interface IGiveGift {
    void GiveKouHong();
    void GiveFlowers();
    void GiveChocolate();
}
/**
 *  
 *	追求者
 */
public class XiaoZhang implements IGiveGift{
    SchoolGirl mm;

    public XiaoZhang (SchoolGirl mm) {
        this.mm = mm;
    }

    @Override
    public void GiveKouHong(){
        System.out.println(mm.getName() + "送你口红");
    }

  	@Override
    public void GiveFlowers(){
        System.out.println(mm.getName() + "送你鲜花");
    }

  	@Override
    public void GiveChocolate(){
        System.out.println(mm.getName() + "送你巧克力");
    }
}
/**
 *   代理
 */
public class Peoxy implements IGiveGift{
    XiaoZhang gg;

    public Peoxy(SchoolGirl mm) {
        gg = new XiaoZhang(mm);
    }


    @Override
    public void GiveKouHong() {
        gg.GiveKouHong();
    }

    @Override
    public void GiveFlowers() {
        gg.GiveFlowers();
    }

    @Override
    public void GiveChocolate() {
        gg.GiveChocolate();
    }
}
@Test
    public void demo3(){
        SchoolGirl xiaohong = new SchoolGirl();
        xiaohong.setName("小红");

        Peoxy peoxy  = new Peoxy(xiaohong);

        peoxy.GiveChocolate();
        peoxy.GiveKouHong();
       	peoxy.GiveFlowers();
    }

整个工程的结构如图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值