提交 7cb10c8d 编写于 作者: C chenjianqiang

代理模式

上级 d21012e2
......@@ -2,6 +2,7 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="e43e9168-5945-4f45-b4c2-1b6410d1eef8" name="Changes" comment="增加策略模式案例&#10;Signed-off-by: chenjianqiang &lt;wushanxi@gmail.com&gt;">
<change beforePath="$PROJECT_DIR$/src/com/pattern/InterpreterPattern/package-info.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/pattern/InterpreterPattern/package-info.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/pattern/PatternApplication.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/pattern/PatternApplication.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
......@@ -15,8 +16,8 @@
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Interface" />
<option value="package-info" />
<option value="Interface" />
<option value="Class" />
</list>
</option>
......@@ -107,11 +108,11 @@
<recent name="com.pattern.demo" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="com.pattern.ProxyPattern.materials.po" />
<recent name="com.pattern.TemplatePattern.materials.po" />
<recent name="com.pattern.SingletonPattern.materials" />
<recent name="com.pattern.FactoryPattern.AbstractFactory.materials.factory" />
<recent name="com.pattern.FactoryPattern.FunctionFactory.materials.factory" />
<recent name="com.pattern.FactoryPattern.FunctionFactory.materials.po" />
</key>
</component>
<component name="RunManager" selected="Application.PatternApplication">
......@@ -154,6 +155,8 @@
<workItem from="1634093719115" duration="14778000" />
<workItem from="1634115899707" duration="377000" />
<workItem from="1634180031509" duration="3704000" />
<workItem from="1636338443252" duration="4865000" />
<workItem from="1636350581794" duration="2451000" />
</task>
<task id="LOCAL-00001" summary="增加策略模式案例&#10;Signed-off-by: chenjianqiang &lt;wushanxi@gmail.com&gt;">
<created>1634096220780</created>
......
......@@ -6,4 +6,8 @@ package com.pattern.InterpreterPattern;
* 使用场景:执行多个固定的终端计算,将多个结果进行与或的判断
* 类说明细:Expression:接口起点;OrExpression:将两个子计算的结果进行或判断;AndExpression:将两个子计算的结果进行与判断;
* 注意事项:一个子计算的结果可以是孙子计算的结果
*
* 解释器模式真的是一个比较少用的模式,因为对它的维护实在是太麻烦了,想象一下,一坨一坨的非终结符解释器,
* 假如不是事先对文法的规则了如指掌,或者是文法特别简单,则很难读懂它的逻辑。
* 解释器模式在实际的系统开发中使用的很少,因为他会引起效率、性能以及维护等问题。
*/
package com.pattern;
import com.pattern.ProxyPattern.ProxyMain;
/**
* @author lx
*/
......@@ -68,6 +70,15 @@ public class PatternApplication {
*/
new ProxyMain().reflectMain();
/*
代理模式
new ProxyMain().staticMain();
2021-10-14:
*/
}
}
package com.pattern.ProxyPattern;
import com.pattern.ProxyPattern.materials.po.BeijingStationImpl;
import com.pattern.ProxyPattern.materials.po.TicketService;
import com.pattern.ProxyPattern.materials.po.YellowBullHandler;
import com.pattern.ProxyPattern.materials.po.YellowBullShopImpl;
/**
* @author lx
* @date 2021/11/8 13:22
**/
public class ProxyMain {
/**
* 静态代理
*/
public void staticMain() {
// 我要买票 --- 去北京站售票处
BeijingStationImpl beijingStation = new BeijingStationImpl();
beijingStation.consultation("1+1=?");
// 我要买票 --- 去黄牛处
YellowBullShopImpl yellowBullShop = new YellowBullShopImpl(beijingStation);
yellowBullShop.consultation("2 + 2 = ?");
}
/**
* 动态代理
*/
public void reflectMain() {
// 我要买票 --- 去北京站售票处
BeijingStationImpl beijingStation = new BeijingStationImpl();
YellowBullHandler handler = new YellowBullHandler();
TicketService subject = (TicketService) handler.newProxyInstance(beijingStation);
subject.consultation("你们卖票的么?");
}
}
package com.pattern.ProxyPattern.materials.po;
/**
* 北京站售票厅
*
* @author lx
* @date 2021/11/8 13:28
**/
public class BeijingStationImpl implements TicketService{
/**
* 咨询票务
* @param question 咨询内容
*/
@Override
public void consultation(String question) {
System.out.println("你咨询的问题是:" + question);
System.out.println("北京售票厅回复了你的消息!");
}
/**
* 卖票
*/
@Override
public void sellT() {
System.out.println("北京售票厅正在给你卖票");
}
/**
* 退票
*/
@Override
public void backT() {
System.out.println("北京售票厅正在给你处理退票服务");
}
}
package com.pattern.ProxyPattern.materials.po;
/**
* 售票服务
* @author lx
*/
public interface TicketService {
/**
* 咨询票务
* @param question 咨询内容
*/
void consultation(String question);
/**
* 卖票
*/
void sellT();
/**
* 退票
*/
void backT();
}
package com.pattern.ProxyPattern.materials.po;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 可以代理很多车站的高级黄牛
* @author lx
* @date 2021/11/8 13:52
**/
public class YellowBullHandler implements InvocationHandler {
/**
* 目标对象
*/
private Object target;
/**
* 绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
*
* @param target 绑定具体的代理实例
* @return 动态代理类实例
*/
public Object newProxyInstance(Object target) {
this.target = target;
/*
该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例。
第一个参数指定产生代理对象的类加载器,需要将其指定为和目标对象同一个类加载器。
第二个参数要实现和目标对象一样的接口,所以只需要拿到目标对象的实现接口。
第三个参数表明这些被拦截的方法在被拦截时需要执行哪个InvocationHandler的invoke方法
根据传入的目标返回一个代理对象
*/
// Proxy.newProxyInstance(target.getClass().getClassLoader(),
// target.getClass().getInterfaces(),
// (proxy, method, args) -> {
// System.out.println("高级黄牛为你服务...");
// Object ret;
// try {
// //调用目标方法
// ret = method.invoke(target, args);
// } catch (Exception e) {
// System.err.println(target.getClass().getName() + method.getName() + e);
// throw e;
// }
// System.out.println("高级黄牛服务结束...");
// return ret;
// });
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("高级黄牛为你服务...");
Object ret;
try {
for (int i = 0; i < args.length; i++) {
System.out.println("参数" + (i + 1) +":"+ args[i]);
}
//调用目标方法
ret = method.invoke(target, args);
} catch (Exception e) {
System.err.println(target.getClass().getName() + method.getName() + e);
throw e;
}
System.out.println("高级黄牛服务结束...");
return ret;
}
}
package com.pattern.ProxyPattern.materials.po;
/**
* 黄牛正在为你服务
*
* @author lx
* @date 2021/11/8 13:28
**/
public class YellowBullShopImpl implements TicketService {
private final BeijingStationImpl bjStation;
public YellowBullShopImpl(BeijingStationImpl bjStation) {
this.bjStation = bjStation;
}
/**
* 咨询票务
*/
@Override
public void consultation(String question) {
runNote();
bjStation.consultation(question);
}
/**
* 卖票
*/
@Override
public void sellT() {
runNote();
bjStation.sellT();
}
/**
* 退票
*/
@Override
public void backT() {
runNote();
bjStation.backT();
}
private void runNote() {
System.out.println("黄牛正在为你服务。。。");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册