实验14:代理模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解代理模式的动机,掌握该模式的结构;
2、能够利用代理模式解决实际问题。
[实验任务]:婚介所
婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。
类图

源代码
public interface AbstractPermission
{//修改个人信息public void modifyUserInfo();//查看他人信息public void lookOthersInfo();//设置年龄public void setAge(int age);
}public class PermissionProxy implements AbstractPermission
{private RealPermission permission = new RealPermission();private int age = 18;//修改个人信息@Overridepublic void modifyUserInfo(){if (age < 18){System.out.println("对不起,不能早恋");} else if (age >= 18){permission.modifyUserInfo();}}//查看他人信息@Overridepublic void lookOthersInfo(){if (age < 18){System.out.println("对不起,不能早恋");} else if (age >= 18){permission.lookOthersInfo();}}//设置年龄@Overridepublic void setAge(int age){this.age = age;}
}public class RealPermission implements AbstractPermission
{@Overridepublic void modifyUserInfo(){System.out.println("修改用户信息");}@Overridepublic void lookOthersInfo(){System.out.println("查看他人信息");}@Overridepublic void setAge(int age){}
}import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;public class XMLUtil
{public static Object getBean(){try{//创建DOM文档对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc = builder.parse(new File("src/main/resources/config14.xml"));//获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode = nl.item(0).getFirstChild();String cName = classNode.getNodeValue();//通过类名生成实例对象并将其返回Class c = Class.forName(cName);Object obj = c.newInstance();return obj;}catch (Exception e){e.printStackTrace();return null;}}
}public class Client
{public static void main(String[] args){AbstractPermission permission = (AbstractPermission) XMLUtil.getBean();permission.modifyUserInfo();permission.lookOthersInfo();System.out.println("--------------");permission.setAge(15);permission.modifyUserInfo();permission.lookOthersInfo();}
}
config14.xml
<?xml version="1.0" encoding="UTF-8"?>
<config><className>Tutorial_14.PermissionProxy</className>
</config>
运行效果