开始啦
说代理模式之前先说一下什么是代理,举个例子:房主,房屋中介这两者之间的关系,房主想把自己的房子租出去,但是他不想在租房子这件事上用太多精力,所以他把房子交给了房屋中介,房主就什么都不管了,剩下的都交给中介,房东不需要直接接触租户就可以把房子租出去,这种情况下,房屋中介就相当于代理。
总结一下,代理就是可以帮助用户将所有的开发注意力集中在核心业务功能上,其他什么都不用考虑,就上面例子来讲,房东的核心业务就是想把房子租出去,至于租房子怎样打广告,或是带租户去看房,他都不用考虑,只要一个结果就是把房子租出去。
1、在项目中的应用场景
在直接访问对象时带来的问题。可能直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
2、应用实例
Windows的快捷方式、spring aop等
3、优缺点
优点:1、职责清晰。 2、高扩展性。 3、智能化。
缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
4、代码实现
就拿上面的房主和房屋中介来说吧
准备:
public interface IHouseOwner {
public void rentHouse();
}
房主类:
public class HouseOwner implements IHouseOwner {
@Override
public void rentHouse() {
//房东最想要的结果
System.out.println("***房子租出去***");
}
}
房屋中介类:
public class HouseProxy implements IHouseOwner{
private IHouseOwner houseOwner;
//HouseProxy主要就是为HouseOwner服务的
public HouseProxy(IHouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
@Override
public void rentHouse() {
//中介对于房子的其他操作,房主不需要考虑的
operation();
//这个是房主最关心的结果,就是房子租出去,其他他都不关注
houseOwner.rentHouse();
}
//这个是房屋中介的其他操作,例如宣传,带租户看房等
public void operation() {
System.out.println("**宣传房子**");
System.out.println("**带客户看房子**");
}
}
测试类:
public class Test {
public static void main(String[] args) {
IHouseOwner houseOwner = new HouseProxy(new HouseOwner());
houseOwner.rentHouse();
}
}