设计模式之观察者与动态代理的结合应用

本文通过具体的源码示例介绍了如何使用动态代理技术对业务逻辑进行增强,并实现了基于用户角色的权限控制。示例中包括业务类BusinessA与BusinessB、服务实现类Service及其实现的业务逻辑、ServiceInterface接口定义、动态代理类ProxyObserver以及测试用例。

概念性的东西本人就不必讲了。现在本人就直接拿源码说明:

 有两个业务类。

public class BusinessA {
    
public static void a() {
        System.out.println(
"println A");
    }

}

public class BusinessB {
    
public static void b() {
        System.out.println(
"println B");
    }

}

 其中有一个业务需要上面这两个类来完成这个业务,而且完成这个业务,还要根据用户是什么样的角色。如果这个角色假设是"1"做什么,其它的做什么。下面这个类是具体业务的实现。

public class Service implements Observer,ServiceInterface{
    
private List<String> list = new ArrayList<String>();

    
public void businessMethod() throws Exception {
        System.out.println(
"start service ");
        
if (list.contains("1")) {
            
// BusinessA.a();
            throw new Exception("您没有这个权限访问此方法.");
        }
 else {
            BusinessA.a();
            BusinessB.b();
        }

        System.out.println(
"end service ");
    }


    
public void update(Observable arg0, Object arg1) {
        
if (arg1 instanceof String[]) {
            
for (int i = ((String[]) arg1).length - 1; i >= 0; i--{
                list.add(((String[]) arg1)[i]);
            }

        }

    }

}

 

具体业务的接口如下:

public interface ServiceInterface {
    
public void businessMethod() throws Exception;

}

动态代理,主要功能是代理业务实现类即Service

 

public class ProxyObserver  implements InvocationHandler {
    
private Object orgin ;
    
public ProxyObserver(Object orgin){
        
this.orgin = orgin ;
    }
    @SuppressWarnings(
"unchecked")
    
    
public Object proxy() {
        
return Proxy.newProxyInstance(orgin.getClass().getClassLoader(),
                orgin.getClass().getInterfaces(), 
this);
    }
    
public Object invoke(Object arg0, Method arg1, Object[] arg2)
            
throws Throwable {
        
// TODO Auto-generated method stub
        if (arg1.getName()=="businessMethod") {
            System.out.println(arg1.getName());
        }
        
return arg1.invoke(orgin, arg2);
    }

}

下面进行一下测试,用户User类其中有一个属性为markcode是存管理员分配的相应的权限,在这里读者可以任意设置。可以控制方法的执行。

 

public static void main(String[] args) {
        
//Observer
        UserObersered userOber = new UserObersered();

        Service service 
= new Service();
        userOber.addObserver(service);
        
        User user 
= new User();
        String[] markcode 
= {"2"};
        user.setMarkcode(markcode);
        userOber.codeChange(user);
        
        ProxyObserver proxyUserWatcher 
= new ProxyObserver(service);
        Object proxy 
= proxyUserWatcher.proxy();
        
try {
            ((ServiceInterface)proxy).businessMethod();
        } 
catch (Exception e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值