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

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

 有两个业务类。

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();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值