设计模式-代理模式
这次主要记录下代理模式的学习过程
一、什么是代理模式
- 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问
- 优点:
- 职责清晰,目标对象只需要关注自己本身的业务逻辑即可,而无需关注其他非本职责的事务
- 高扩展性,可以根据需求动态地添加代理对象,而无需更改原有的代码,符合开闭原则
- 缺点:
- 实现代理模式,需要额外的工作
- 代理类过多,会导致程序变得复杂
二、代理模式UML图
三、代理模式示例
送礼物抽象类
即Subject类 (抽象实体类),定义了RealSubject类和Proxy类的共用接口
/**
* @Title: SendGifts.java
* @Description: 送礼物抽象类
* @Author: xj
* @Date: 2018/9/26 23:15
*/
public abstract class SendGifts {
public abstract void sendFlower();
public abstract void sendMilk();
public abstract void sendChocolate();
}
被追求者类
/**
* @Title: PrettyGirl.java
* @Description: 被追求者
* @Author: xj
* @Date: 2018/9/26 23:20
*/
public class PrettyGirl {
private String name;
public PrettyGirl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
追求者类
即RealSubject类 (真实实体类),是Proxy类所代表的真实实体
/**
* @Title: Pursuer.java
* @Description: 追求者类
* @Author: xj
* @Date: 2018/9/26 23:19
*/
public class Pursuer extends SendGifts {
private PrettyGirl prettyGirl;
public Pursuer(PrettyGirl prettyGirl) {
this.prettyGirl = prettyGirl;
}
@Override
public void sendFlower() {
System.out.println(prettyGirl.getName() + ": 送你鲜花!");
}
@Override
public void sendMilk() {
System.out.println(prettyGirl.getName() + ": 送你牛奶!");
}
@Override
public void sendChocolate() {
System.out.println(prettyGirl.getName() + ": 送你巧克力!");
}
}
代理类
持有一个对真实实体的引用,在其方法中调用真实实体类中对应的方法,从而起到代理的作用
/**
* @Title: Proxy.java
* @Description: 代理类
* @Author: xj
* @Date: 2018/9/26 23:26
*/
public class Proxy extends SendGifts {
private Pursuer pursuer;
public Proxy(PrettyGirl prettyGirl) {
this.pursuer = new Pursuer(prettyGirl);
}
@Override
public void sendFlower() {
pursuer.sendFlower();
}
@Override
public void sendMilk() {
pursuer.sendMilk();
}
@Override
public void sendChocolate() {
pursuer.sendChocolate();
}
}
测试类
/**
* @Title: Test.java
* @Description: 测试类
* @Author: xj
* @Date: 2018/9/26 23:29
*/
public class Test {
public static void main(String[] args) {
PrettyGirl prettyGirl = new PrettyGirl("小白");
Proxy proxy = new Proxy(prettyGirl);
proxy.sendFlower();
proxy.sendMilk();
proxy.sendChocolate();
}
}
输出结果
以上就是抽象工厂模式的一个小例子

浙公网安备 33010602011771号