设计模式-代理模式学习笔记
前言:不包含动态代理
代理模式
代理模式为其他对象提供一种代理以控制对这个对象的访问。(代理类替代具体的实现类,代理类可根据需求添加内容而不用修改实现类)
- 优缺点
优点:
- 满足了开闭原则
- 可扩展性高(当需求添加内容可通过代理类添加)
- 保护了实现类(可以隐藏并且不用修改),也增强了实现类的功能
缺点:
- 在实现类和调用类之间出现代理类,影响请求速度
- 类的数量增加,程序变得复杂
- 结构
Subject:代理类和实现类的父类
RealSubject:具体的实现类,被代理对象
Proxy:代理类(代理对象,调用时被调用的对象)

- 代码
引用《大话设计模式》中的例子,为人做嫁衣,一位同学想追求李娇娇同学,但是由于含羞,所以请另一位同学代为送礼物
抽出父类
/**
* @ Author :fonxi
* @ Date :2019/5/13 5:11
* @ Description:代理和被代理对象的共同父类
*/
public interface GiveGift {
void giveDolls();
void giveFlowers();
void giveChocolate();
}
女孩类
/**
* @ Author :fonxi
* @ Date :2019/5/13 5:08
* @ Description:女孩
*/
public class SchoolGirl {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
被代理对象,实现具体的操作
/**
* @ Author :fonxi
* @ Date :2019/5/13 5:08
* @ Description:被代理类 追求者类
*/
public class Pursuit implements GiveGift{
SchoolGirl mm;
public Pursuit(SchoolGirl mm){
this.mm = mm;
}
@Override
public void giveDolls() {
System.out.println(mm.getName()+"送你洋娃娃");
}
@Override
public void giveFlowers() { System.out.println(mm.getName()+"送你鲜花");
}
@Override
public void giveChocolate() {
System.out.println(mm.getName()+"送你巧克力");
}
}
代理对象,调用被代理对象的操作,并且可以提供增强的操作
/**
* @ Author :fonxi
* @ Date :2019/5/13 5:12
* @ Description:代理类
*/
public class Proxy implements GiveGift{
Pursuit pursuit;
public Proxy(SchoolGirl mm){
pursuit = new Pursuit(mm);
}
@Override
public void giveDolls() { pursuit.giveDolls();
}
@Override
public void giveFlowers() { pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
pursuit.giveChocolate();
}
//代理对象新增的操作
public void giveBook(){
System.out.println("送书");
}
}
/**
* @ Author :fonxi
* @ Date :2019/5/13 5:15
* @ Description:客户端调用类
*/
public class TestController {
public void print(){
SchoolGirl mm = new SchoolGirl();
mm.setName("李娇娇");
Proxy proxy = new Proxy(mm);
proxy.giveDolls();
proxy.giveChocolate();
proxy.giveFlowers();
proxy.giveBook();
}
}
- 总结
代理模式可以让具体的操作对象被隐藏,并且可以在不修改操作对象的情况下扩展它的功能。

浙公网安备 33010602011771号