如何运用代理模式解耦你的程序

程序员以码字为主要任务,一份代码写出来总归要经过多番的测试,调试与修改。作为一个java程序员,一般使用一些静态检查工具做一些初步的测试:

checkstyle:用来检查代码的格式,主要是一些代码规范的问题,当然首先你得有一个规范。
findbugs:找出程序中隐藏的一些漏洞,在某些时候可能会给你致命一击。
PMD:复杂度检测工具,用来检查代码的逻辑复杂度,当然我们常说的代码耦合程度是里面的一个特例。

代码的耦合度,是指代码中的单元代码的紧密程度,其中一个单元代码的更改对其它单元代码的影响力与作用。代码间的耦合度越高,系统就在变动时就更加难以控制,但并非不能控制,只是你将为此付出巨大的代价。一句话就是:牵一发而动全身。

我们现在使用的3层分层结构,就是用来解耦的一个绝佳示例,当然,这是相对于一个大的框架而言,是个总体设计。分层结构诞生的最初使用者和他的最初用意我不知道是什么,但就分层结构所带来的好处,无疑是解耦。它使得页面层,业务逻辑层,数据库层的代码可以完全的分开,达到分层编码,互不干扰,重复利用的目的。

代理模式:为目标对象提供一种代理以控制对这个对象的访问模式。
代理模式有三个角色
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

下面是一个使用代理模式解耦程序的例子。
A,B,C,D,E5个对象在调用F这个对象里面的p或者其他方法时,需要添加一些判断控制,而这些判断控制又需要通过G对象来获取,同时我们可能需要对p方法进行一些附加的操作,来满足个性化的需求。
这样的问题一般有3个解决方式:
1.在A,B,C,D,E这些要调用p方法的地方,通过G对象来添加判断,同时添加附件的操作。
2.在F对象的P方法里面通过G对象来添加判断,同时添加附加的操作。
3.使用代理模式,在A,B,C,D,E与F之间增加一个代理类M,M对象里面来获取G对象添加判断,通过F对象来调用P方法,同时添加附加的操作。

1这种方法显然为最下等的方法,这样写代码的耦合度相当高,如果下次要改变需求,那么涉及到的地方都需要修正,也就是需要修改5个地方,如果有更多的对象的话,那么工作量更大。
2这种方法在绝大多数的时候可以解决问题,但是如果我们还有一些条件的话,这样的修改就不能满足了。比如F对象里面不允许引用G对象,那么我们的判断控制就无法添加了。比如添加的附加操作是完全的个性化的东西,而F对象又是一个可以重复利用的对象的话,那么这样的修改就会使得F对象变成了个性化的对象,而不再是一个独立的,可重复利用的对象,这在F对象是数据库访问对象时显得尤为明显,我们显然不能因为要满足需求而去破坏它原来的特性。同时也增加了代码的耦合度,原本不属于这个对象东西也出现在了这个对象里面。
3这种方法无疑是最好的。在不破坏F对象的同时,满足了所有的需求。

下面是具体的代码实现。
抽象角色:
public interface Test
{
public void p(Object obj);
}
真实角色:实现了抽象接口
public class F implements Test
{
public void p(Object obj)
{
save(obj);
}
}
代理角色:
public class M implements Test
{
//持有的真实对象
private F f=null;

//持有的访问判断控制的对象
private G g=null;

//带参构造方法
public M(F f,G g)
{
this.f=f;
this.g=g;
}

//实现抽象接口的方法
public void p(Object obj)
{
//判断控制,是否启用P方法
if(g.isUseP)
{
//附加操作
f.p(obj);
//附加操作
}
}
}
访问对象:A,B,C,D,E
比如A里面:
..................
M fProxy=new M(new F(),new G());
fProxy.p(obj);
..................
原文地址:https://www.cnblogs.com/komojoemary/p/proxy.html