代理模式这个名字就起的很合适,它所要做的就是“代理”这件事,可以分为静态代理和动态代理。
先说静态代理。
其实我觉得静态代理更像是在不改动原有基础类的原则上进行延伸更多的操作,就像继承那样,多了更多的方法,当然这是我初次的感觉,话不多说,用一个小例子来带入静态代理。
现在我来到上海,我想去租一间房,对,需求出现了,那么涉及租房的话就有一个人你必须要知道就是房东,但是很多房东不喜欢这其中的繁文缛节,于是怎么办呢?中介(代理)就来了,于是中介承担了中间一系列如带人看房、签合同等等的操作,顺便还赚了一波,而我作为租户我只需要和中介进行一系列的交流,房东什么的是连毛都没有见到。
接下来用程序来实现这个件事情。
//这是租房这件需求,一般是接口或者抽象类
public interface Rent {
public void rent();
}
//这是房东,上面那个需求对准的就是她
public class Host implements Rent {
public void rent() {
System.out.println("我要租我的房子,但是其他的处理事务我不想干");
}
}
//中介来了
public class Proxy {
private Host host;
public Proxy(){
}
public Proxy(Host host){
this.host=host;
}
public void rent(){
host.rent();
seeHouser();
getHeTong();
getMoney();
}
public void seeHouser(){
System.out.println("中介带人看房");
}
public void getHeTong(){
System.out.println("中介和租户签合同");
}
public void getMoney(){
System.out.println("中介人要收中介费");
}
}
//最后就是刚来上海的我和这个一脸善笑、个性开朗的兄弟一阵沟通
public class ZuHu {
public static void main(String[] args) {
Host host=new Host();
Proxy proxy=new Proxy(host);
proxy.rent();
}
}
以上就是代理模式的实现,也就是说个体类更专注于自己所作的事,而公共的事务不需要操心交给代理类,但随之也会有麻烦,一个个体类就需要一个代理类与之环环相扣,如此代码量会增加。
但感觉这样好像并没有什么用,有个例子。
我们正常开发的时候在service会有service层的方法,我们假设抽象为增删改查。
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("add方法");
}
@Override
public void delete() {
System.out.println("delete方法");
}
@Override
public void update() {
System.out.println("update方法");
}
@Override
public void query() {
System.out.println("query方法");
}
}
现在出问题了,Boss要求在每个类中增加一个日志方法,于是怎么办呢?一个一个的打开去增加,先不说这困难与否(有很多实现类的情况下),=但是一般情况下我们是不应该在原有的类上进行改动的,你刚到一个公司就接到这个任务你开始着手在上面改动,结果任务没整好原有代码改崩了怎么办?所以这个时候代理模式是比较好的。
于是乎就可以出现下面的代码。
public class UserServiceImplProxy {
private UserService userService;
public void setUserService(UserService userService){
this.userService=userService;
}
public void add(){
log("add");
userService.add();
}
public void delete(){
log("delete");
userService.delete();
}
public void update(){
log("upadte");
userService.update();
}
public void query(){
log("query");
userService.query();
}
public void log(String message){
System.out.println("使用了"+message+"方法");
}
}