您的位置:首页 > 编程语言 > Java开发

java 代理模式 详解(奶粉代购例子)

2015-10-30 09:29 633 查看
先看例子:

package com.zq.designpattern.proxy;

/**
* Created by zhengshouzi on 2015/10/29.
*/
public class ProxyPattern {
public static void main(String[] args) {

//三聚氰胺..........于是奶粉代购火了
// 但是不是每个人都有空随时去德国(这就可以看成是远程代理)
// 当然德国的奶粉生产商也不可以能直接和每个想买奶粉的人打交道,他说我只卖给代理商(这可以看成是保护代理,控制应用对象具有不同的访问权限)
// 这时候朋友圈里面跳出来来一个奶粉代购妹妹,
//奶粉原价是100,但是代理价200,代理给你加价了,这就是在一个代理对象前后执行了附加的操作(这可以看成是智能指引代理,他在访问前后执行了附加操作)</span></span>
MilkProxy milkProxy = new MilkProxy();

//张三准备卖5罐奶粉
milkProxy.sell(5);
//李四买10罐
milkProxy.sell(10);
//王五买20罐
milkProxy.sell(20);

System.out.println("代购收益:"+milkProxy.computeProfit());
}
}

interface Milk{
void sell(int number);
}

class Manufacturer implements Milk{

private int number=2000;
private String name;
private int price;
private  int saledCount=0;

public int getPrice() {
return price;
}
public Manufacturer(){
name = "牛奶";
price = 100;
}
public void sell(int number) {
System.out.println("生产商卖  "+number+"  罐奶粉给代购");
saledCount +=number;
}
}

class MilkProxy implements Milk{

//代理知道生产商上哪儿找生产商,
Manufacturer manufacturer = new Manufacturer();
private int price=0;
private int saledCount=0;
private long profit=0;
private int size=0;

public MilkProxy(){
this.price=200;
}

@Override
public void sell(int number) {
size +=number;
while(size>20){
//打开下面的注释这样写表示当你能够靠卖奶粉赚到钱的时候(只买1两件,代理商怎么愿意跑一趟德国嘛),代理商才真正的去找生产商(可以看成是虚代理)
//manufacturer = new Manufacturer();</span></span>
System.out.println("去拿货");
//实际上他是在帮生产商卖牛奶,然后自己赚差价
manufacturer.sell(size);
System.out.println("代购卖  " + size + "  罐奶粉给客户");
saledCount+=size;
size=0;
}
}
public long computeProfit(){
profit = saledCount*(price-manufacturer.getPrice());
return profit;
}

}



通过这个例子,我像你明白什么是代理模式了吧。

代理模式

  代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

  在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式一般涉及到的角色

  抽象角色:声明真实对象和代理对象的共同接口(例子里的牛奶接口)。

  代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象(代理商)。

  同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

  真实角色:代理角色所代表的真实对象,是我们最终要引用的对象(生产商)。

问题

  如果要按照上述的方式(静态代理)使用代理模式,那么真实角色必须是实现已经存在的,并将其作为代理对象的内部属性。

  但是实际使用时,一个真实角色必须对应一个代理角色,但如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息