/**
* 代理模式:当用户希望和某个对象打交道时可能不希望直接访问该对象,而是提供一个特殊的对象,作为该访问对象的代理
*
* 特点:代理对象与所代理的对象实现了相同的接口,也就是说代理和代理对象向用户公开了相同的方法。当用户请求调用这样的方法时,可能会检查他所代理的对象是否可用。
*
* 元素:抽象主题,实际主题,代理
*
*/
/**
* 抽象主题
*
*/
public interface AbstractTheme {
//该方法模拟求三角形的面积
public abstract void getArea();
}
/**
* 实际主题
*
*/
public class RealTheme implements AbstractTheme{
public void getArea() {
System.out.println("实际主题计算三角形面积成功");
}
}
/**
* 代理
*
*/
public class DaiLiTheme implements AbstractTheme{
RealTheme realTheme;
int i;//作为代理对象是否可用
//可能会判断代理对象的是否可用
public void getArea() {
if (i==0) {
realTheme = new RealTheme();//实际主题
realTheme.getArea();
}else{
System.out.println("不是三角形");
}
}
public void setiValue(int i){
this.i = i;
}
}
public class Main {
/**
* 代理模式:当用户希望和某个对象打交道时可能不希望直接访问该对象,而是提供一个特殊的对象,作为该访问对象的代理
*
* 特点:代理对象与所代理的对象实现了相同的接口,也就是说代理和代理对象向用户公开了相同的方法。当用户请求调用这样的方法时,可能会检查他所代理的对象是否可用。
*
* 元素:抽象主题,实际主题,代理
*
*/
public static void main(String[] args) {
DaiLiTheme daiLiTheme = new DaiLiTheme();
daiLiTheme.setiValue(0);
daiLiTheme.getArea();
}
}
//动态代理模式
/**
* 抽象角色
*
*/
interface Person {
public abstract void phone(String str);
}
/**
* 具体角色
*
*/
public class Boss implements Person{
public void phone(String str) {
System.out.println("电话内容:"+ str);
}
}
/**
* 代理角色(当正式角色较多,会造成代理角色臃肿)
*
* InvocationHandler 可以在运行时动态生成代理类(“代理角色”)
*
*/
public class MiShu implements InvocationHandler{
private Object obj = null;
public MiShu(Object obj){
this.obj = obj;
}
//InvocationHandler的抽象方法,创建MiShu时会执行改方法
public Object invoke(Object arg0, Method method, Object[] arg2)throws Throwable {
Object result = null;
result = method.invoke(this.obj, arg2);
return result;
}
//返回改代理类的实例
public static Object factory(Object object){
Class objClass = object.getClass();
return Proxy.newProxyInstance(objClass.getClassLoader(), objClass.getInterfaces(), new MiShu(object));
}
}
public class Main {
public static void main(String[] args) {
Boss boss = new Boss();
Person person = (Person)MiShu.factory(boss);
person.phone("正在拨打电话151");
}
}