1 代理模式
即Proxy Pattern,23种常用的面向对象软件的设计模式之一。(设计模式的说法源自《设计模式》一书,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly Longman.Inc。该书提出了23种基本设计模式,第一次将设计模式提升到理论高度,并将之规范化。)
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2 代理模式之静态代理
2.1 业务介绍
假设学生为核心类,学生做的事情是代理类。学生需要做的核心业务有:学习(study)、做家庭作业(homeWork);需要做的非核心业务为:准备上课(打开书本、预习)、准备做家庭作业(打开作业本、检查)。
2.2 创建学生类接口:Student
1 package com.cqvie.proxy.static_; 2 3 public interface Student { 4 5 public void study(String study); 6 public void homeWork(String homework); 7 }
2.3 创建学生实现类:StudentDao,并且实现学生接口(Student)
1 package com.cqvie.proxy.static_; 2 3 public class StudentDao implements Student { 4 5 @Override 6 public void study(String study) { 7 System.err.println("今天的学习内容是:" + study); 8 } 9 10 @Override 11 public void homeWork(String homework) { 12 System.err.println("今天的家庭作业是:" + homework); 13 } 14 15 }
2.4 创建一个学生的代理类:Student_Proxy,并且实现学生接口
1 package com.cqvie.proxy.static_; 2 3 /** 4 * 代理对象(Student_proxy)的目的是帮助核心对象(StudentDao)做非核心的事情。 5 * 但是代理对象(Student_proxy)必须和核心对象(StudentDao)实现共同的接口。 6 */ 7 public class Student_Proxy implements Student { 8 9 //定义一个学生接口 作为属性,目的是就是在处理完代理需要做的事情之后调用学生需要做的核心业务, 10 //但不是代理具体去做这些核心的事情,只是调用它们而已。 11 private Student stu; 12 13 //创建一个代理的参数为学生接口 的构造函数 14 public Student_Proxy(Student stu) { 15 this.stu = stu; 16 } 17 18 @Override 19 public void study(String study) { 20 21 //这个是代理(Student_proxy)准备学习前需要做的流程: 22 System.out.println("代理:打开书本"); 23 System.out.println("代理:提前预习"); 24 System.out.println("*****************"); 25 26 //通过定义的属性,并且在调用Student_proxy的含参数的构造函数创建相对应的实例,调用这个具体的实例的方法 27 stu.study(study); 28 29 //这个是代理(G3Student_proxy)准备 后需要做的流程: 30 System.out.println("*****************"); 31 System.out.println("代理:课后复习"); 32 System.out.println("代理:关闭书本"); 33 System.out.println(); 34 } 35 36 @Override 37 public void homeWork(String homework) { 38 39 //这个是代理(Student_proxy)准备做作业前需要做的流程: 40 System.out.println("代理:打开作业本"); 41 System.out.println("代理:准备笔"); 42 System.out.println("*****************"); 43 44 //通过定义的属性,并且在调用Student_proxy的含参数的构造函数创建相对应的实例,调用这个具体的实例的方法 45 stu.homeWork(homework); 46 47 //这个是代理(G3Student_proxy)准备做作业后需要做的流程: 48 System.out.println("*****************"); 49 System.out.println("代理:检查作业"); 50 System.out.println("代理:关闭作业本"); 51 System.out.println(); 52 } 53 54 }
2.5 进行测试,定义测试类Test
1 package com.cqvie.proxy.static_; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 7 //创建一个代理对象 8 Student stu = new Student_Proxy(new StudentDao()); 9 //通过这个代理对象执行相关的方法(代理对象和核心对象有共同接口) 10 stu.study("数学"); 11 stu.homeWork("8 * 9 = ?"); 12 } 13 14 }
6. 运行效果如图所示