Java23种设计模式案例:代理模式(Proxy)

原创
2017/07/16 23:41
阅读数 744

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

1、使用场景

想在访问一个类时做一些控制

2、代码实现

我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。

ProxyPatternDemo,我们的演示类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。

(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.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg

(3)实现一个追眉眉的案例

package demo22.ProxyModel;


//代理接口
interface IGiveGift{
	void GiveDolls();
	void GiveFlowers();
	void GiveChocolate();
}

class SchoolGirl{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

//追求者,唯一变化就是让"追求者"去实现"送礼物"接口
class Pursuit implements IGiveGift{
	SchoolGirl mm;
	public Pursuit(SchoolGirl mm){
		this.mm = mm;
	}
	public void GiveDolls(){
		System.out.println(mm.getName()+" 送你洋娃娃");
	}
	@Override
	public void GiveFlowers() {
		System.out.println(mm.getName()+" 送你鲜花");
		
	}
	@Override
	public void GiveChocolate() {
		System.out.println(mm.getName()+" 送你洋巧克力");
		
	}
}

//代理类 ,让代理类也去实现"送礼物"接口
class ProxyClass implements IGiveGift{
	Pursuit gg;
	
	public ProxyClass(SchoolGirl mm){
		gg = new Pursuit(mm);
	}

	@Override
	public void GiveDolls() {
		// TODO Auto-generated method stub
		gg.GiveDolls();
	}

	@Override
	public void GiveFlowers() {
		// TODO Auto-generated method stub
		gg.GiveChocolate();
	}

	@Override
	public void GiveChocolate() {
		// TODO Auto-generated method stub
		gg.GiveFlowers();
	}
	
}

public class ProxyModelDemo {
	public static void main(String args[]){
		SchoolGirl jiaojiao  = new SchoolGirl();
		jiaojiao.setName("李娇娇");
		
		ProxyClass daili = new ProxyClass(jiaojiao);
		daili.GiveChocolate();
		daili.GiveDolls();
		daili.GiveFlowers();
		
	}

}

 

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部