JAVA设计模式:代理模式
代理模式:即为指定的目标对象提供一个代理商,由代理商来完成对目标对象的操作。
代理类图:

抽象对象角色或者接口角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方就都可以使用代理对象。
目标对象角色:定义了所需要代理对象的真实对象。
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象通常在客户端调用目标对象之前或之后,执行某个操作,而不是单纯直接调用真实对象。
接口:
public interface Subject
{
void doSomething();
}
目标对象角色:
package com.njupt.study.designmodle.proxy;
public class RealSubject implements Subject {
@Override
public void doSomething()
{
System.out.println("做些什么呢?");
}
}
代理对象角色:
package com.njupt.study.designmodle.proxy;
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject()
{
if(realSubject == null)
{
realSubject = new RealSubject();
}
}
@Override
public void doSomething()
{
System.out.println("befor do something");
realSubject.doSomething();
System.out.println("after do something");
}
}
客户端访问:
package com.njupt.study.designmodle.proxy;
public class Client {
/**
* @param args
*/
public static void main(String[] args)
{
Subject subject = new ProxySubject();
subject.doSomething();
}
}
输出:

总结:
代理模式的功能 : 通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端使用这个代理对象来操作真实的对象(当客户端操作这个代理对象的时候,实际上功能最终还是会由真实的对象来完成,只不过是通过代理操作的,也就是客户端操作代理,代理操作真正的对象)

下面以人去买车来作为实例讲解如下:
抽象的接口:
package com.njupt.study.designmodle.proxy;
/**
* 新建一个买车的接口
* @author Pony
*
*/
public interface Buy_Car
{
public void buy_mycar();
}
真实对象:
package com.njupt.study.designmodle.proxy;
public class People implements Buy_Car
{
private int cash;
private String vip;
private String username;
@Override
public void buy_mycar() {
System.out.print(username+"是vip 客户,可以直接购买新车!");
}
public int getCash() {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
public String getVip() {
return vip;
}
public void setVip(String vip) {
this.vip = vip;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
代理对象;
package com.njupt.study.designmodle.proxy;
/**
* people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车:
* @author Pony
*
*/
public class ProxyClass implements Buy_Car
{
private People people;
public People getPeople() {
return people;
}
public void setPeople(People people) {
this.people = people;
}
@Override
public void buy_mycar()
{
if (people.getVip() == "vip")
{
people.buy_mycar();
return;
}
if (people.getCash() >= 50000)
{
System.out.println(people.getUsername() + "买了新车,交易结束!");
} else {
System.out.println(people.getUsername() + "钱不够,不能买车,继续比赛!");
}
}
}
客户端:
package com.njupt.study.designmodle.proxy;
public class RunClient {
/**
* @param args
*/
public static void main(String[] args) {
People people_1 =new People();
people_1.setCash(60000);
people_1.setUsername("jeck");
People people_2 =new People();
people_2.setCash(40000);
people_2.setUsername("rose");
People people_3 =new People();
people_3.setCash(0);
people_3.setUsername("tom");
people_3.setVip("vip");
ProxyClass proxy_buy = new ProxyClass();
proxy_buy.setPeople(people_1);
proxy_buy.buy_mycar();
proxy_buy.setPeople(people_2);
proxy_buy.buy_mycar();
proxy_buy.setPeople(people_3);
proxy_buy.buy_mycar();
}
}
运行结果如下:


浙公网安备 33010602011771号