环境:一个红酒厂商,是不会直接把红酒零售给客户的,都是通过代理来完成他的销售业务。而客户也不用为了购买红酒而到处找工厂,他只要找到厂商在当地的代理就行,具体红酒工厂在那里,客户不用关心,代理会帮他处理。
问题:一个客户不想或者不能直接引用另一个对象,此时可以通过一个“中介”来实现间接引用,这个起中介作用的对象就是代理对象。可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
解决方案:代理模式
角色:
抽象主题(接口)
代理主题(代理类)
真实主题(委托类|实现类)
红酒代理商在红酒厂商和客户之间起到中介的作用,红酒代理商作为红酒厂商的代理必须要知道被代理对象能做哪些事情不能做哪些事情,所以他们要实现同一个接口。
定义一个红酒厂商
public interface RedWindFactory {
void makeWind();
}
拉斐酒庄是一个红酒厂商
public class Lafite implements RedWindFactory{
@Override
public void makeWind() {
System.out.println("拉斐酒庄酿造红酒");
}
}
张裕爱斐堡酒庄也是一个红酒厂商
public class ZhangYu implements RedWindFactory{
@Override
public void makeWind() {
System.out.println("张裕爱斐堡酒庄酿造红酒");
}
}
有一个红酒代理商代理拉斐红酒
public class RedWindProxy implements RedWindFactory{
private RedWindFactory redWindFactory;
//默认代理拉斐
public RedWindProxy(){
this.redWindFactory = new Lafite();
}
public RedWindProxy(RedWindFactory redWindFactory){
this.redWindFactory = redWindFactory;
}
@Override
public void makeWind() {
redWindFactory.makeWind();
}
public void soldWind(){
System.out.println("销售红酒,感谢客户的购买!");
}
}
客户想购买红酒
public class Customer {
public static void main(String[] args) {
//客户来到红酒代理商(比如名为蓝菲)购买拉斐
RedWindProxy proxyLanFei = new RedWindProxy();
//表面上看是红酒代理商酿造的红酒,实际是红酒工厂酿造的
proxyLanFei.makeWind();
//购买拉斐酒庄生产的红酒
proxyLanFei.soldWind();
//由于某种原因,蓝菲成为中国张裕红酒的代理商,只要张裕也是红酒厂商,蓝菲就可以作为其代理商
//客户此时就能在蓝菲购买到张裕生产的红酒了
proxyLanFei = new RedWindProxy(new ZhangYu());
proxyLanFei.makeWind();
proxyLanFei.soldWind();
}
}
java代理模式有静态代理和动态代理,以上讲的是静态代理,动态代理使用反射技术实现。