概要
设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。
定义
为其它的对象提供一种代理,以控制这个对象的访问
使用场景
当不想直接访问某个对象的时候,就可以通过代理
1.不想买午餐,同事帮忙带
2.买车不用去厂里,去4s店
3.去代理点买火车票,不用去车站
UML
介绍下上面的UML图的意思,以购买火车票为例
(1)IProxy
定义代理的接口,买票
(2)ProxyObject
代理的对象,完成代理的任务,设置具体的代理,调用具体的代理方法等
(3)RealObject
具体的代理对象,处理具体的业务逻辑
简单的介绍了他们之间的关系,看起来非常的简单
代码实现
上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:
(1)定义代理接口
package com.zengtao.demo.proxy;
public interface IProxy {
void buyTicket();
}
(2)代理
package com.zengtao.demo.proxy;
/**
* 代理
*/
public class Proxy implements IProxy {
private RealProxy realClient;
public Proxy(RealProxy realClient) {
this.realClient = realClient;
}
@Override
public void buyTicket() {
realClient.buyTicket();
}
}
(3)具体代理买票
package com.zengtao.demo.proxy;
import com.zengtao.demo.bean.User;
/**
* 具体代理买票
*/
public class RealProxy implements IProxy {
private User user;
public RealProxy() {
}
public RealProxy(User user) {
this.user = user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public void buyTicket() {
// 具体实现逻辑
if (user != null) {
System.out.println("***********我要买票***********");
System.out.println("信息如下:");
System.out.println("姓名:" + user.getName());
System.out.println("性别:" + user.getSex());
System.out.println("身份证号:" + user.getCardCode());
System.out.println("住址:" + user.getHomeAddress());
System.out.println("***********信息已核对***********");
System.out.println("出票成功:动车D2222次09车20A");
}
}
}
(4)用户对象
package com.zengtao.demo.bean;
import java.io.Serializable;
@SuppressWarnings("serial")
public class User implements Serializable {
private String cardCode;
private String name;
private String homeAddress;
private String sex;
public String getCardCode() {
return cardCode;
}
public void setCardCode(String cardCode) {
this.cardCode = cardCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHomeAddress() {
return homeAddress;
}
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
(6)具体调用
package com.zengtao.demo;
import com.zengtao.demo.bean.User;
import com.zengtao.demo.proxy.Proxy;
import com.zengtao.demo.proxy.RealProxy;
public class Main {
public static void main(String[] str) {
// 用户信息
User user = new User();
user.setCardCode("510522177709096836");
user.setSex("男");
user.setName("无名氏");
user.setHomeAddress("地球村第七号店铺");
// 具体代理
RealProxy realClient = new RealProxy();
realClient.setUser(user);
// 代理
Proxy proxy = new Proxy(realClient);
proxy.buyTicket();
}
}
(7)结果
以上以代理模式的方式,简陋的实现了购票的流程。
总结
大家也可以看到,其实代理模式,说白了就是委托,将所有的事情都委托给别人帮你完成,你所要做的,就是给代理一些东西,接下来所有的事情都是代理帮你完成,你完全不用去关心内部是如何实现的。
代理模式:一般可以分为两种,一种为静态代理,一种为动态代理
(1)静态代理
静态代理:就是我们上述所写的,代理代码是由我们自己去生成的固定的代码进行编译
(2)动态代理
动态代理:动态代理,跟静态代理相反,它是用反射机制动态的生成代理的对象,我们不需要知道谁代理谁
由于篇幅原因,动态代理
请看下篇 设计模式之代理模式(动态代理)
—————End————-