代理模式可以让程序的分工更加明确,
用代理模式可以在业务前和业务后增加功能 降低程序的耦合
比如我想吃一个苹果,我又不想亲自去果园摘苹果,装箱啥的,所以要用代理
代理的关键在于,代理类要包含客户类的对象
比如吃苹果这个例子,最终吃苹果的人是我,总不能让代理把苹果吃了吧,
所以代理要包含客户类的对象,然后用客户类的对象调用吃苹果的方法
那么这里有一个问题,既然要包含客户对象,为何不直接在代理类里面创建客户对象呢?
比如这样:
class proxy{
client a;
client b;
client c;
client d;
}
这样的话,谁要吃苹果,调用谁的吃苹果方法就可以了
这样的话存在一个很大的问题,代理商面对的客户是成千上万的,总不能在代理类里面创建成千上万个对象吧,
所以要用接口 ,这样代理商可以用一个函数(一般用构造函数)去接收来自不同客户对象,然后利用实现不同客户的吃苹果过程,
class proxy{
eatappleimpl eatobject;//创建一个接口类型,用于接收客户类型
receive(eatappleimpl eatclient) {
eatobject=eatclient//接受客户类型
}
eatobject.eat();//利用接口调用方法
}
而且这样做的好处是可以在吃苹果前和吃苹果后做一些处理,
比如吃苹果前要洗苹果,吃苹果后要扔垃圾桶
这写操作都可以定义在代理类里面,
具体案例:
0.先定义吃苹果接口
package daili;
public interface eatappleimpl {
void eat();
}
1.定义客户类:
package daili;
public class clientA implements eatappleimpl{
@Override
public void eat() {
System.out.println("客户A吃苹果");
}
}
2.定义代理类
package daili;
public class proxy implements eatappleimpl{
@Override
public void eat() {
beforeeat();
proxyeat.eat();
aftereat();
}
eatappleimpl proxyeat=null;
void receive(eatappleimpl clienteat) {
proxyeat=clienteat;
}
void beforeeat() {
System.out.println("吃苹果前的准备");
}
void aftereat() {
System.out.println("吃苹果后的处理");
}
}
3.测试类
package daili;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
proxy pp=new proxy();
clientA CA=new clientA();
pp.receive(CA);
pp.eat();
}
}