代理模式
场景描述:
1. 卓贾易喜欢娇娇, 但是, 娇娇并不认识卓贾易, 那么他给娇娇送花, 送巧克力,送洋娃娃
2. 卓贾易也可以不这么做, 他喜欢娇娇, 找一个人, 让这个人吧鲜花, 巧克力和洋娃娃送给娇娇.
这是两种方式, 但达到的目的是一样的。我们下面来看看这两个代码的实现:
第一种: 卓贾易喜欢娇娇, 那么他给娇娇送花, 送巧克力,送洋娃娃
追求者
代码语言:javascript复制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() " 送你巧克力");
}
}
被追求者
代码语言:javascript复制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;
}
}
客户端
代码语言:javascript复制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. 戴励送的礼物是卓贾易买的
既然戴励和卓贾易的行为都是一样的. 用面向对象的思想考虑. 肯定要把变化点抽象出来了. 结构图如下:
首先有一个父类: 送礼物.
代理和追求者都实现了送礼物这个类, 代理还关联追求者类。
代码实现如下:
礼物抽象类
代码语言:javascript复制package com.designModel.chapter7_proxyModel.step2;
/**
* 送礼物抽象类
*/
public abstract class SendGift {
public abstract void sendDolls();
public abstract void sendChocolate();
public abstract void sendFlower();
}
追求者
代码语言:javascript复制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() " 送你巧克力");
}
}
代理
代码语言:javascript复制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();
}
}
被追求者
代码语言:javascript复制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;
}
}
客户端
代码语言:javascript复制public static void main(String[] args) {
SchoolGril sg = new SchoolGril();
sg.setName("娇娇");
Proxy proxy = new Proxy(sg);
proxy.sendChocolate();
proxy.sendDolls();
proxy.sendFlower();
}
运行结果:
代码语言:javascript复制娇娇 送你巧克力
娇娇 送你洋娃娃
娇娇 送你鲜花