设计模式-代理模式
代理模式实例之日志记录代理
1. 类图
上图为该次实验的类图
2. 实现代码
(1)AbstractSubject抽象类
package proxy;
public abstract class AbstractSubject {
public abstract void method();
}
(2)LoggerProxy代理类
package proxy;
import java.text.SimpleDateFormat;
public class LoggerProxy extends AbstractSubject {
private BusinessClass businessClass = new BusinessClass();
@Override
public void method() {
before();
businessClass.method();
after();
}
public void before(){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("业务方法被调用, 调用时间为: " + df.format(System.currentTimeMillis()));
}
public void after(){
System.out.println("业务方法调用完成");
}
}
(3)被代理类
package proxy;
public class BusinessClass extends AbstractSubject{
@Override
public void method() {
System.out.println("执行业务");
}
}
(4)Client客户类
package proxy;
public class Client {
public static void main(String[] args) {
//面向父类编程,符合开闭原则
AbstractSubject abstractSubject;
//抽象父类的具体子类对象从ProxyXMLUtil.getBean()方法中获得
//该方法是从xml文件中获取具体的代理类
abstractSubject = (AbstractSubject) ProxyXMLUtil.getBean();
abstractSubject.method();
}
}
(5)ProxyXMLUtil辅助类
package proxy;
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 ProxyXMLUtil
{
public static Object getBean()
{
try
{
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("D:\\Idea_project\\DesignPattern\\src\\proxy\\ProxyConfig.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;
}
}
}
(6)XML配置文件
<?xml version="1.0"?>
<config>
<className>proxy.LoggerProxy</className>
</config>
3.输出结果
以上就是本次代理模式的简单实验啦,另外,当想要更换代理类实现不同的操作时,只需在XML文件中填入对应的类即可,无需修改客户端的源代码,这样很好的支持了开闭原则