您的位置:首页 > 编程语言 > Java开发

java设计模式总结八:代理模式

2017-11-02 13:29 417 查看

代理模式定义

代理模式就是给一个对象提供一个代理对象,由这个代理对象控制对原对象的引用,使代理类在客户端和原对象之间起到一个代理的作用

在不适用代理模式的情况下我们将两个类进行关联时,就需要在一个类的代码中直接调用另一个类,后续如果需要进行特殊的处理,就需要直接在该类中修改代码,这违背了设计模式的开闭原则,并且当很多类需要进行相同的特殊处理的时候,每一个类都必须编写相同的处理代码,无法实现代码的复用

而在这里使用代理模式,让代理类来代理两个类之间的关联,从而只需要对代理类做相应的特殊处理即可实现同样的效果,并且遵循了开闭原则,实现了代码的复用

代理模式很好的将两个直接关联的类进行了解耦,并且还可以在代理类中添加额外的代码,以进行特殊的处理

代理模式使用举例

就以马拉松比赛举例,参赛者A和B,最终比赛胜利是看谁跑的时间久,这个时候如果我们让A和B各自计时,以设计模式的角度来看,就违背了单一职责原则,以现实角度来看,两个人各自记录时间进行比赛多多少少也会有点不准确性,也不现实,哈哈!所以这个时候我们可以将记录时间这一个功能交给裁判去实现,从而实现了类的单一职责原则,并且如果后续想要进行一些特殊的时间处理比如说暂停,就只需要对裁判的实现进行一些改变即可, 而不需要改变所有的参赛者

代理模式组成

主要由三部分组成:抽象目标类、具体目标类和代理类,其中代理类主要用于将两个具体目标类进行关联

代理模式实现

一步步来,首先我们以薪资计算举例不使用代理模式实现一个简单的事件记录:

public class Salary{
public void dosalary(){
System.out.println("正在进行薪资计算");
//一系列操作
}
}


我们进行客户端薪资计算

public class Client{
public static void main(String[] args){
Salary sal = new Salary();
sal.dosalary();
}
}


简单的薪资计算这样实现倒是没有问题,此时如果我们想要对薪资计算这一个过程增加时间统计过程

public class Client{
public static void main(String[] args){
Salary sal = new Salary();
long start = System.nanoTime();
sal.dosalary();
long end = System.nanoTime();
System.out.println("spend time ->"+end-start);
}
}


这只是简单的进行一次薪资计算时间统计,需要改变客户端代码,而此时如果我们还在进行其他的计算也需要进行时间计算比如进行付款时间统计:

public class pay{
public void dopay(){
System.out.println("正在进行付款");
//一系列操作
}
}

public class Client{
public static void main(String[] args){
Salary sal = new Salary();
long start = System.nanoTime();
sal.dosalary();
long end = System.nanoTime();
System.out.println("salary time is "+end-start);
Pay pay = new Pay();
start = System.nanoTime();
pay.dopay();
end = System.nanoTime();
System.out.println("pay time is "+end-start);
}
}


我们发现仅仅两次计算客户端就需要增加不少的代码,如果进行计算的类很多,客户端增加的代码有多么多可想而知

这里我们可以使用代理类来代理时间统计功能实现,基于面向接口编程,我们可以将一系列计算的操作定义一个统一接口,如下:

public interface Inteface{
public void dosome();
}

//薪资计算
public class Salary implements Interface{
public void dosome(){
//dosalary方法体
}
}

//付款计算
public class Pay implements Interface{
public void dosome(){
//dopay方法体
}
}


定义一个代理类

public class Proxy{
private Interface inter;
public Proxy(Interface inter){
this.inter = inter;
}
public void doProxy(){
long start = System.nanoTime();
inter.dosome();
long end = System.nanoTime();
System.out.println("操作时间记录为:"+end-start);
}
}


客户端只需要简单的创建对象并进行相同的调用就可以实现不同的操作的时间统计了:

public class Client{
public static void main(String[] args){
//薪资时间计算
Interface inter = new Salary();
Proxy proxy = new Proxy(inter);
proxy.doProxy();
//付款时间计算
inter = new Pay();
proxy = new Proxy(inter);
proxy.doProxy();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: