代理模式

来源:互联网 发布:中万网络 域名 编辑:程序博客网 时间:2024/06/06 03:21
/** * 代理模式:当用户希望和某个对象打交道时可能不希望直接访问该对象,而是提供一个特殊的对象,作为该访问对象的代理 *  * 特点:代理对象与所代理的对象实现了相同的接口,也就是说代理和代理对象向用户公开了相同的方法。当用户请求调用这样的方法时,可能会检查他所代理的对象是否可用。 *  * 元素:抽象主题,实际主题,代理 *  */


/** * 抽象主题 * */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");}}




0 0