Loading

静动态

 1 角色分析:
 2 
 3 - 抽象角色:一般会使用接口或者抽象类来解决
 4 - 真实角色:被代理的角色
 5 - 代理角色:代理真是角色,代理真实角色后,我们一般会做一些附属操作。
 6 - 客户:访问代理对象的人!
 7 ```
 8 //下面这个例子是静态
 9 //接口
10 public interface UserService {
11     //添加
12     void add();
13     //删除
14     void delete();
15     //修改
16     void update();
17     //查询
18     void query();
19 }
 1 //实现类 
 2 public class UserServiceImpl implements  UserService {
 3     @Override
 4     public void add() {
 5         System.out.println("增加一个学生");
 6     }
 7 
 8     @Override
 9     public void delete() {
10         System.out.println("删除一个学生");
11     }
12 
13     @Override
14     public void update() {
15         System.out.println("修改一个学生");
16 
17     }
18 
19     @Override
20     public void query() {
21         System.out.println("查找一个学生");
22 
23     }
24 }
 1 //增加一个类
 2 public class UserServiceProxy implements UserService {
 3     private UserService userService;
 4 
 5     public void setUserService(UserService userService) {
 6         this.userService = userService;
 7     }
 8 
 9     @Override
10     public void add() {
11         logger("增加");
12         userService.add();
13     }
14 
15     @Override
16     public void delete() {
17         logger("删除");
18         userService.delete();
19     }
20 
21     @Override
22     public void update() {
23         logger("修改");
24         userService.update();
25     }
26 
27     @Override
28     public void query() {
29         logger("查询");
30         userService.query();
31     }
32 
33     //日志
34     public void logger(String msg){
35         System.out.println("使用"+msg);
36     }
37 }
1 //测试
2 public class Cilent {
3     public static void main(String[] args) {
4         UserServiceImpl userService = new UserServiceImpl() ;
5         UserServiceProxy u = new UserServiceProxy();
6         u.setUserService(userService);
7         u.delete();
8     }
9 }

上面这个是静态代理,下面这个使用动态实现
----------------------------------------------------------------------------------
下面这个例子是动态代理实现

 1 //接口
 2 public interface UserService {
 3     //添加
 4     void add();
 5     //删除
 6     void delete();
 7     //修改
 8     void update();
 9     //查询
10     void query();
11 }
 1 //实现类
 2 public class UserServiceImpl implements  UserService {
 3     @Override
 4     public void add() {
 5         System.out.println("增加一个学生");
 6     }
 7 
 8     @Override
 9     public void delete() {
10         System.out.println("删除一个学生");
11     }
12 
13     @Override
14     public void update() {
15         System.out.println("修改一个学生");
16 
17     }
18 
19     @Override
20     public void query() {
21         System.out.println("查找一个学生");
22 
23     }
24 }
 1 //通过代理实现增加业务
 2 public class ProxyInvocationHandler implements InvocationHandler {
 3     private Object targer;
 4 
 5     public void setTarger(Object targer){
 6         this.targer=targer;
 7     }
 8 
 9     public Object getProxy(){
10         return Proxy.newProxyInstance(this.getClass().getClassLoader(),
11                 targer.getClass().getInterfaces(),
12                 this);
13     }
14     @Override
15     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
16         loogger(method.getName());
17         Object result= method.invoke(targer, args);
18 
19         return result;
20     }
21     public void loogger(String msg){
22         System.out.println("你使用了"+msg+"方法");
23     }
24 }
 1 --测试类
 2 
 3 
 4 public class Client {
 5     public static void main(String[] args) {
 6            //真实角色
 7         UserServiceImpl userService = new UserServiceImpl();
 8           //代理角色
 9         ProxyInvocationHandler pih = new ProxyInvocationHandler();
10          //通过调用程序处理角色来出来我们要调用的接口对象
11         pih.setTarger(userService);
12         UserService proxy = (UserService) pih.getProxy();
13         proxy.delete();
14     }
15 }
代理模式的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
缺点:
- 一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低

 

posted @ 2020-04-04 13:50  Rzk  阅读(270)  评论(0)    收藏  举报