设计模式之代理模式

来源:互联网 发布:mac word繁体变简体 编辑:程序博客网 时间:2024/06/06 23:50

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

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();    }}

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

参考:《大话设计模式》

原创粉丝点击