代理模式
代理模式(Proxy) :为其他对象提供一种代理以控制对这个对象的访问
举个例子来理解,假设XXXX高中学校,小张暗恋隔壁班的小红,但小张由于内向,不敢去表白,于是找到与小红同班的好哥们–小明,让小明帮帮小张带个口信去表白…
综上总结:小张(追求者)、小红(被追求者)、小明(代理)
具体如下:
1、没有代理的代码
/**
* 没有代理的代码
* 追求者
*/
public class XiaoZhang {
SchoolGirl mm;
public XiaoZhang (SchoolGirl mm) {
this.mm = mm;
}
public void GiveKouHong(){
System.out.println(mm.getName() + "送你口红");
}
public void GiveFlowers(){
System.out.println(mm.getName() + "送你鲜花");
}
public void GiveChocolate(){
System.out.println(mm.getName() + "送你巧克力");
}
}
/**
* 被追求者
*/
public class SchoolGirl {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 没有代理的代码
*/
@Test
public void demo1(){
SchoolGirl xiaohong = new SchoolGirl();
xiaohong.setName("小红");
XiaoZhang xiaozhang = new XiaoZhang (xiaohong);
xiaozhang.GiveChocolate();
xiaozhang.GiveKouHong();
xiaozhang.GiveFlowers();
}
没有代理的代码就变成了,小张直接送礼物给小红,但此时小红不认识小张,所以不能这么写
2、只有代理的代码
/**
* 只有代理的代码
*/
public class Peoxy {
SchoolGirl mm;
public Peoxy(SchoolGirl mm) {
this.mm = mm;
}
public void GiveKouHong(){
System.out.println(mm.getName() + "送你口红");
}
public void GiveFlowers(){
System.out.println(mm.getName() + "送你鲜花");
}
public void GiveChocolate(){
System.out.println(mm.getName() + "送你巧克力");
}
}
/**
* 只有代理的代码
*/
@Test
public void demo2(){
SchoolGirl xiaohong = new SchoolGirl();
xiaohong.setName("小红");
Peoxy peoxy = new Peoxy(xiaohong);
peoxy.GiveChocolate();
peoxy.GiveKouHong();
peoxy.GiveFlowers();
}
只有代理的代码就变成了,小明直接送礼物给小红,但此时是小张向小红表白,而不是小明,所以不能这么写
3、符合实际的代码
/**
* 接口
*/
public interface IGiveGift {
void GiveKouHong();
void GiveFlowers();
void GiveChocolate();
}
/**
*
* 追求者
*/
public class XiaoZhang implements IGiveGift{
SchoolGirl mm;
public XiaoZhang (SchoolGirl mm) {
this.mm = mm;
}
@Override
public void GiveKouHong(){
System.out.println(mm.getName() + "送你口红");
}
@Override
public void GiveFlowers(){
System.out.println(mm.getName() + "送你鲜花");
}
@Override
public void GiveChocolate(){
System.out.println(mm.getName() + "送你巧克力");
}
}
/**
* 代理
*/
public class Peoxy implements IGiveGift{
XiaoZhang gg;
public Peoxy(SchoolGirl mm) {
gg = new XiaoZhang(mm);
}
@Override
public void GiveKouHong() {
gg.GiveKouHong();
}
@Override
public void GiveFlowers() {
gg.GiveFlowers();
}
@Override
public void GiveChocolate() {
gg.GiveChocolate();
}
}
@Test
public void demo3(){
SchoolGirl xiaohong = new SchoolGirl();
xiaohong.setName("小红");
Peoxy peoxy = new Peoxy(xiaohong);
peoxy.GiveChocolate();
peoxy.GiveKouHong();
peoxy.GiveFlowers();
}
整个工程的结构如图: