代理模式
场景描述:
1. 卓贾易喜欢娇娇, 但是, 娇娇并不认识卓贾易, 那么他给娇娇送花, 送巧克力,送洋娃娃
2. 卓贾易也可以不这么做, 他喜欢娇娇, 找一个人, 让这个人吧鲜花, 巧克力和洋娃娃送给娇娇.
这是两种方式, 但达到的目的是一样的。我们下面来看看这两个代码的实现:
第一种: 卓贾易喜欢娇娇, 那么他给娇娇送花, 送巧克力,送洋娃娃
追求者
package com.designModel.chapter7_proxyModel.step1; /** * 追求者 */ public class Pursuit { //追求的对象 private SchoolGril sg; public Pursuit(SchoolGril sg){ this.sg = sg; } // 行为: 给被追求者送花,送巧克力, 送洋娃娃 public void sendFllower(){ System.out.println(sg.getName() + " 送你鲜花"); } public void sendDolls(){ System.out.println(sg.getName() + " 送你洋娃娃"); } public void sendChocolate(){ System.out.println(sg.getName() + " 送你巧克力"); } }
被追求者
package com.designModel.chapter7_proxyModel.step1; /** * 被追求者 */ public class SchoolGril { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
客户端
public static void main(String[] args) { SchoolGril sg = new SchoolGril(); sg.setName("娇娇"); Pursuit pursuit = new Pursuit(sg); pursuit.sendChocolate(); pursuit.sendDolls(); pursuit.sendFllower();
}
从代码来看, 卓贾易和娇娇是认识的. 并且, 卓贾易直接把鲜花, 巧克力, 洋娃娃送给了娇娇.
而实际上, 卓贾易和娇娇可能是不认识的. 这时候, 卓贾易也不好直接把鲜花, 巧克力, 洋娃娃送给娇娇. 于是, 就找了一个和娇娇熟悉的人戴励, 把礼物送给娇娇.
这时候, 戴励就是一个中间的代理. 他替卓贾易送礼品, 但实际上礼品是卓贾易买的. 找戴励送过去的. 这个代码怎么实现呢?注意一下几点:
1. 戴励和卓贾易的行为是一样的. 送礼物
2. 戴励送的礼物是卓贾易买的
既然戴励和卓贾易的行为都是一样的. 用面向对象的思想考虑. 肯定要把变化点抽象出来了. 结构图如下:
首先有一个父类: 送礼物.
代理和追求者都实现了送礼物这个类, 代理还关联追求者类。
代码实现如下:
礼物抽象类
package com.designModel.chapter7_proxyModel.step2; /** * 送礼物抽象类 */ public abstract class SendGift { public abstract void sendDolls(); public abstract void sendChocolate(); public abstract void sendFlower(); }
追求者
package com.designModel.chapter7_proxyModel.step2; /** * 追求者 */ public class Pursuit extends SendGift { private SchoolGril sg; public Pursuit(SchoolGril sg) { this.sg = sg; } // 行为: 给被追求者送花,送巧克力, 送洋娃娃 @Override public void sendFlower(){ System.out.println(sg.getName() + " 送你鲜花"); } @Override public void sendDolls(){ System.out.println(sg.getName() + " 送你洋娃娃"); } @Override public void sendChocolate(){ System.out.println(sg.getName() + " 送你巧克力"); } }
代理
package com.designModel.chapter7_proxyModel.step2; public class Proxy extends SendGift { private Pursuit pu; public Proxy(SchoolGril sg){ pu = new Pursuit(sg); } @Override public void sendDolls() { pu.sendDolls(); } @Override public void sendChocolate() { pu.sendChocolate(); } @Override public void sendFlower() { pu.sendFlower(); } }
被追求者
package com.designModel.chapter7_proxyModel.step2; /** * 被追求者 */ public class SchoolGril { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
客户端
public static void main(String[] args) { SchoolGril sg = new SchoolGril(); sg.setName("娇娇"); Proxy proxy = new Proxy(sg); proxy.sendChocolate(); proxy.sendDolls(); proxy.sendFlower(); }
运行结果:
娇娇 送你巧克力
娇娇 送你洋娃娃
娇娇 送你鲜花