前言:
在阅读Spring Security官方文档时,里面设计到了一种设计模式——代理模式Proxy
众里寻她千百度,蓦然回首,那人却在灯火阑珊处
开始
在之前的文章里陈述了一个观点——编程语言和语言没有区别
现看看我们日常生活中的代理,代理这个词可能听得少,但是加一个被修饰词就听多了
现实中最常见的代理模式:麦当劳,华莱士,手机旗舰店,连锁餐饮店
小故事:站长我啊,手机坏了,不知道怎么修,只能去找对应的旗舰店去修,店长(代理人)看见我笑嘻嘻,但是他笑不出声,因为站长的手机是五年前的,他们旗舰店没有对应的配件,他也不会修,只好把我的手机寄到代理商,代理商专门帮我解决,这也是有些店修手机一个小时就好,而有些店修手机要修他个12小时
总结:在现实中的代理模式中,代理人起到的是对接业务,代理商呢?代理是直接处理业务吗?
很显然不是,代理商只提供了一个平台,处理业务的是代理产品
业务 + 平台 + 业务 = 代理模式
代理模式的定义:
所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网上连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。(百度百科)
组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
翻译一下:
在面向对象编程时,这个角色翻译成对象更符合语境
稍微做了一些修改,真实对象,实际上就是实现业务逻辑的对象
来看看代码
代理商
public interface SmsService {String send(String message);
}
代理产品1
public class SmsServiceImpl implements SmsService {public String send(String message) {System.out.println("send message:" + message);return message;}
}
代理产品2
public class SmsProxy implements SmsService {private final SmsService smsService;public SmsProxy(SmsService smsService) {this.smsService = smsService;}@Overridepublic String send(String message) {System.out.println("before method send()");smsService.send(message);System.out.println("after method send()");return null;}
}
代理人
public class Main {public static void main(String[] args) {SmsService smsService = new SmsServiceImpl();SmsProxy smsProxy = new SmsProxy(smsService);smsProxy.send("java");}
}
ok
核心:业务 + 平台 + 业务
1.0版本,仅供参考,不算很完善