设计模式之代理模式

假如有个男生想要追求隔壁班一个女生,假如两个人认识的话,可以直接送礼物,抽象成代码如下:

class Pursuer {
    SchoolGirl mm;

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

    public void giveFlowers() {
        System.out.println(mm.getName() + ", give you flowers");
    }

    public void giveChocolate() {
        System.out.println(mm.getName() + ", give you chocolate");
    }
}

class SchoolGirl {
    private String name;

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

    public String getName() {
        return name;
    }

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

public class Test {
    public static void main(String[] args) {
        SchoolGirl schoolGirl = new SchoolGirl("Mary");

        Pursuer pursuer = new Pursuer(schoolGirl);
        pursuer.giveChocolate();
        pursuer.giveFlowers();
    }
}

不过现在的问题是两者完全不认识,或者不想要让这两者直接认识,此时可以引入一个第三方代理,比如说认识这个女生的同桌,通过第三方代理作为两者的桥梁。

既然代理是双方的桥梁,则必须依赖于双方。

而代理是用来代替一方进行操作的,所以所具有的行为必须一致,只不过代理的行为实际上是调用了某一方的行为而已。因此还需要引入一个公共接口定义公共行为。

实现步骤如下:
1.首先定义一个代理者和被代理者共有的行为接口

public interface IPursue {
    void giveFlowers();

    void giveChocolates();

    void giveDolls();
}

2.实现被代理者

public class Pursuer implements IPursue {
    SchoolGirl mm;

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

    @Override
    public void giveFlowers() {
        System.out.println(mm.getName() + ", give you flowers");
    }

    @Override
    public void giveChocolates() {
        System.out.println(mm.getName() + ", give you chocolates");
    }

    @Override
    public void giveDolls() {
        System.out.println(mm.getName() + ", give you dolls");
    }
}

3.实现代理者,注意代理者的构造方法是创建了一个被代理者,然后进行的行为都是调用被代理者的方法。

public class PursuerProxy implements IPursue {

    private Pursuer pursuer;

    public PursuerProxy(SchoolGirl mm) {
        pursuer = new Pursuer(mm);
    }

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

    @Override
    public void giveChocolates() {
        pursuer.giveChocolates();
    }

    @Override
    public void giveDolls() {
        pursuer.giveDolls();
    }
}

4.进行调用

public class Test {
    public static void main(String[] args) {
        SchoolGirl schoolGirl = new SchoolGirl("Abby");

        PursuerProxy proxyPursuer = new PursuerProxy(schoolGirl);
        proxyPursuer.giveChocolates();
        proxyPursuer.giveFlowers();
        proxyPursuer.giveDolls();
    }
}

代理模式将被代理者隐藏起来,暴露出代理者供外界调用。

参考:《大话设计模式》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值