代理模式

来源:互联网 发布:linux查看网络流量 编辑:程序博客网 时间:2024/06/05 05:04

代理模式属于结构型模式。

创建具有现有对象的对象,以便向外界提供功能接口


意图:为其他对象提供一种代理以控制对这个对象的访问

主要解决:在直接访问对象时带来的问题

何时使用:想在访问一个类时做一些控制

如何解决:增加中间层。

关键代码:实现与被代理类组合。

应用实例猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 

优点: 

1、职责清晰。

2、高扩展性。 

3、智能化。

缺点: 

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 

2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

注意事项 
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 
2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

步骤 1

创建一个接口。

Image.java

public interface Image {   void display();}

步骤 2

创建实现接口的实体类。

RealImage.java

public class RealImage implements Image {   private String fileName;   public RealImage(String fileName){      this.fileName = fileName;      loadFromDisk(fileName);   }   @Override   public void display() {      System.out.println("Displaying " + fileName);   }   private void loadFromDisk(String fileName){      System.out.println("Loading " + fileName);   }}

ProxyImage.java

public class ProxyImage implements Image{   private RealImage realImage;   private String fileName;   public ProxyImage(String fileName){      this.fileName = fileName;   }   @Override   public void display() {      if(realImage == null){         realImage = new RealImage(fileName);      }      realImage.display();   }}

步骤 3

当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。

ProxyPatternDemo.java

public class ProxyPatternDemo {       public static void main(String[] args) {      Image image = new ProxyImage("test_10mb.jpg");      //图像将从磁盘加载      image.display();       System.out.println("");      //图像将无法从磁盘加载      image.display();        }}

步骤 4

验证输出。

Loading test_10mb.jpgDisplaying test_10mb.jpgDisplaying test_10mb.jpg