使用AOP思想设计会员分级系统

通过动态代理模式实现会员权限控制,不改动业务逻辑即可为不同会员级别提供定制化服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现有如下业务层接口和实现类:

package user;
public interface MathInterFace {
    int add(int a,int b);
}
 
 
package user;
public class MathImpl implements MathInterFace {
    //
    //
    public int add(int aint b) {
        return a+b;
    }
}
 
需求:不改变业务层代码的情况下,给业务层增加会员分级系统
VIP会员:特权:在使用add方法时,所得结果会再加上100
普通会员:可以正常使用add方法
无权限会员:无权使用

思路:
1.首先,我们需要一个工厂类,业务层对象均从此类静态方法获取
 调用本类静态方法获取业务层对象时,需要传递进来一个参数,以得知会员等级,根据会员等级创建对应的调用处理器
 


package user;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.ResourceBundle;
/**
 * 
 * @author 
 * @QQ 997208868
 * @date 2015-08-31 17:13:20
 */
public class ProxyFactory {
    /**
     * 使key
     * 使
     * @param clazzKey key
     * @return 
     */
    public static MathInterFace getInstance(String clazzKey) {
        //
        MathInterFace m = new MathImpl();
        //null
        MathInterFace mm =null;
        try {
            //
            ResourceBundle rb = ResourceBundle.getBundle("user");
            //clazzKey使mm
            //
            mm = (MathInterFace) Proxy.newProxyInstance(m.getClass().getClassLoader(), 
                    m.getClass().getInterfaces(), 
                    (InvocationHandler) Class.forName(rb.getString(clazzKey)).
                    getConstructor(MathInterFace.class).newInstance(m));
        } catch (Exception e) {
            return null;
        }
        //
        return mm;
    }
}
 


 2.同时,我们要创建user.properties用户等级配置文件,存放在src目录下
 
vip=user.Vip
default=user.Default
untitled=user.Untitled
 不同的用户等级,对应不同的调用处理类
 
3.写vip调用处理器
 
package user;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 
 */
public class Vip implements InvocationHandler {
    private MathInterFace m;
    
    //m使
    public Vip(MathInterFace m) {
        this.m=m;
    }
    
    public Object invoke(Object proxyMethod methodObject[] args)
            throws Throwable {
        System.out.println("VIP");
        /*
         * 
         * 
         *      使
         */
        //
        args[0= (Integer)args[0]+100;
        //
        return method.invoke(m,args);
    }
}
 
4.写普通用户调用处理器
 
package user;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 
 */
public class Default implements InvocationHandler {
    private MathInterFace m;
    
    public Default(MathInterFace m) {
        this.m=m;
    }
    
    public Object invoke(Object proxyMethod methodObject[] args)
            throws Throwable {
        System.out.println("");
        return method.invoke(m,args);
    }
}
 
 5.写无权限用户调用处理器

package user;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 
 */
public class Untitled implements InvocationHandler {
    private MathInterFace m;
    
    public Untitled(MathInterFace m) {
        this.m=m;
    }
    
    public Object invoke(Object proxyMethod methodObject[] args)
            throws Throwable {
        /*
         * 
         * 
         */
        if ("add".equals(method.getName())) {
            System.out.println("");
            System.out.println("使");
            return 0;   //nulladd
        }else {
            return method.invoke(margs);
        }
    }
}
 
 6.编写测试类
 
package user;
public class ProxyDemo {
    public static void main(String[] args) {
        //
        //1.VIP使add100
        //2.使add
        //3.使add使
        
        //VIP
        MathInterFace m = ProxyFactory.getInstance("vip");
        System.out.println(m.add(12));
        
        //
        MathInterFace m2 = ProxyFactory.getInstance("default");
        System.out.println(m2.add(12));
        
        //
        MathInterFace m3 = ProxyFactory.getInstance("untitled");
        m3.add(12);
    }
}
 
执行结果:
 
欢迎您,尊敬的VIP用户:
103
欢迎您,普通用户:
3
你是无权限用户
不能使用此功能!

总结:
装饰者模式:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。
动态代理模式:对其他对象进行代理,以控制对被代理对象的访问。
 
一个是扩展功能,一个是控制访问。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值