- package com.liang.pattern;
- public interface UserManager {
- public void addUser(String userId,String userName);
- public void delUser(String userId);
- public void modifyUser(String userId,String userName);
- public String findUser(String userId);
- }
目标对象
- package com.liang.pattern;
- public class UserManagerImpl implements UserManager {
- public void addUser(String userId, String userName) {
- try{
- System.out.println("UserManagerImpl.addUser() userId-->>" + userId);
- }catch(Exception e){
- e.printStackTrace();
- throw new RuntimeException();
- }
- }
- public void delUser(String userId) {
- System.out.println("UserManagerImpl.delUser() userId-->>" + userId);
- }
- public String findUser(String userId) {
- System.out.println("UserManagerImpl.findUser() userId-->>" + userId);
- return "于亮";
- }
- public void modifyUser(String userId, String userName) {
- System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId);
- }
- }
代理类,我们使用代理对象做一些日志记录,我们将简略的信息打印到控制台。
- package com.liang.pattern;
- public class UserManagerImplProxy implements UserManager {
- private UserManager userManager;
- public UserManagerImplProxy(UserManager userManager){
- this.userManager = userManager;
- }
- public void addUser(String userId, String userName) {
- //记录日志等操作或打印输入参数
- System.out.println("start-->>addUser() userId-->>" + userId);
- try{
- userManager.addUser(userId, userName);
- //执行成功,打印成功信息
- System.out.println("success-->>addUser()");
- }catch(Exception e){
- e.printStackTrace();
- //失败时,打印失败信息
- System.out.println("error-->>addUser()");
- //throw new RuntimeException();
- }
- }
- public void delUser(String userId) {
- //同上,略
- userManager.delUser(userId);
- }
- public String findUser(String userId) {
- //同上,略
- userManager.findUser(userId);
- return null;
- }
- public void modifyUser(String userId, String userName) {
- //同上,略
- userManager.modifyUser(userId, userName);
- }
- }
客户端调用
- package com.liang.pattern;
- public class Client {
- /**
- * @param args
- */
- public static void main(String[] args) {
- UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());
- userManager.addUser("001","于亮");
- }
- }
优缺点
优点:
1、直观感受,静态代理是实实在在的存在的,我们自己写的。
2、在编译期加入,提前就指定好了谁调用谁,效率高。
缺点:
同样,它的优点也成了它致命的缺点。
1、静态代理很麻烦,需要大量的代理类
当我们有多个目标对象需要代理时,我就需要建立多个代理类,改变原有的代码,改的多了就很有可能出问题,必须要重新测试。
2、重复的代码会出现在各个角落里,违背了一个原则:重复不是好味道
我们应该杜绝一次次的重复。
3、在编译期加入,系统的灵活性差