假如有个男生想要追求隔壁班一个女生,假如两个人认识的话,可以直接送礼物,抽象成代码如下:
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();
}
}
代理模式将被代理者隐藏起来,暴露出代理者供外界调用。
参考:《大话设计模式》