控制反转(Inversion of Control)大大降低了代码的耦合性。实例是由容器注入到对象中,而不是主动创建的。

IoC将对象生成放置在配置文件中,只需要修改配置文件就可以更换实现类。

实现简单的IOC

public interface Action { public String execute(String str);
} public class UpperAction implements Action { private String message; public String getMessage() {  return message;  } public void setMessage(String string) { message = string;   } public String execute(String str) { return (getMessage() + str).toUpperCase(); }
} public class LowerAction implements Action { private String message; public String getMessage() {  return message;  } public void setMessage(String string) { message = string;   } public String execute(String str) { return (getMessage() + str).toLowerCase(); }
} 
public class ActionFactory {public static Action getAction(String actionName) {Properties prop = new Properties();try {ClassLoader loader = ActionFactory.class.getClassLoader();prop.load(loader.getResourceAsStream("config.properties"));String actionImplName = (String) prop.get(actionName);String actionMessage = (String) prop.get(actionName + "_msg");Class cl = Class.forName(actionImplName);Object obj = cl.newInstance();// 反射机制获取域参数并为域参数值注入值Field[] fields = cl.getDeclaredFields();Field field = fields[0];String fieldName = field.getName();String firstLetter = fieldName.substring(0, 1).toUpperCase();String setMethodName = "set" + firstLetter + fieldName.substring(1);Method setMethod = cl.getMethod(setMethodName, new Class[] { field.getType() });setMethod.invoke(obj, new Object[] { actionMessage });return (Action) obj;} catch (Exception e) {e.printStackTrace();}return null;}
}

config.properties配置文件:

TheAction=test.UpperAction

TheAction_msg=Hello

public class TestAction {public static void main(String[] args) { Action action = ActionFactory.getAction("TheAction"); System.out.println(action.execute(“ World ")); }
}

输出结果:

HELLO WORLD

设计模式—代理模式

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户端不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理的常见应用就是对遗留系统的封装。

代理模式一般涉及到的角色有

抽象角色:声明真实对象和代理对象的共同接口

代理角色:代理对象角色一般内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装

真实角色:代理角色所代表的真实对象,是最终要引用的对象

代理模式-原理图

代理类和被代理类均派生自同一个接口,被代理类对象作为代理类构造函数参数的方式将代理权交出,代理类有接口中定义的方法,还有其他事务处理方法。

代理模式-时序图

代理模式-例子

public interface UserDAO {public void saveUser(User user);
}
public class UserDAOImpl implements UserDAO {@Overridepublic void saveUser(User user) {System.out.println("save a user," + "Id:" + user.getId() + ",Name:"+ user.getName());}
}
public class UserDAOProxy implements UserDAO {private UserDAO userDAO;public UserDAOProxy(UserDAO userDAO) {this.userDAO = userDAO;}@Overridepublic void saveUser(User user) {startTransaction();userDAO.saveUser(user);endTransaction();}private void startTransaction() {System.out.println("start transaction.");}private void endTransaction() {System.out.println("end transaction.");}
}
public class User {private Integer id;       private String name;public User(Integer id, String name) {super();this.id = id;     this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class Test {public static void main(String[] args) {UserDAO userDAO = new UserDAOProxy(new UserDAOImpl());userDAO.saveUser(new User(1, "Peter"));}
}

 输出:

start transaction.

save a user,Id:1,Name:Peter

end transaction.

由以上代码可以看出,客户实际需要调用的是UserDAOImpl类的saveUser()方法,现在用UserDAOProxy来代理UserDAOImp类,同样达到目的,同时还进行了事务的处理,当然还可以处理一些其他问题,如安全、日志等。

另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。(待续)

JAVA IOC及代理模式相关推荐

  1. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  2. Java设计模式(三) -- 代理模式

    代理是一种设计模式,即通过代理对象访问目标对象,这样可以在目标对象实现的基础上,增强额外的功能,即扩展目标类的功能. 通常编程中存在一种思想,即不要随意修改别人的代码或者方法,所以代理就可以在不修改目 ...

  3. Java设计模式之代理模式(Proxy)

    参考http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的 ...

  4. Java设计模式-Proxy代理模式

    问题分析: 什么是代理模式呢?其实我们在生活中并不少见.对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络. 还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理:如果 ...

  5. 轻松学,Java 中的代理模式(proxy)及动态代理

    我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...

  6. Java 设计模式之代理模式

    1.静态代理 被代理对象和代理对象都要实现相同的接口或者继承相同的父类. 不需要修改被代理对象就可以实现对功能的扩展,缺点是如果接口发生变化,比如增加新方法,被代理对象和代理对象都需要维护. 1)首先 ...

  7. java设计模式之——代理模式

    1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...

  8. Java中的代理模式

    1.什么是代理模式 代理模式:就是为其他对象提供一种代理以控制对这个对象的访问. 代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能). 举个例子来说明代理的作用: 一般我们想邀请明星来当 ...

  9. 模式代码 java中aes_深入浅出:Java中的代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象,用来在系统中对原始的接口进行替换,然后在内部做一些增强处理.代理模式不会破坏系统的原有接口,不去修改原有的 ...

最新文章

  1. 烂泥:mysql5.5数据库cmake源码编译安装
  2. Burp Suite入门笔记
  3. mysql的left join和inner join的效率对比,以及如何优化
  4. 单例模式 GetInstance()
  5. Android—TableLayout自定义表格
  6. 基于小程序的Token身份权限体系
  7. java 运用poi读取Excel 文件代码 demo
  8. 美国计算机科学奥林匹克竞赛试题,中学信息奥林匹克竞赛试题精选.doc
  9. 下载envi中遇到的问题
  10. 天翼对讲机写频软件_手台对讲机应该怎么选?
  11. 没想到一个起点中文网都可以掀起这么大的波澜
  12. [Android 测试] 性能回归测试之 MonkeyRunner使用、插件扩展、结合批处理
  13. Windows桌面应用程序(1-2-4-2nd) 桌面窗口管理器
  14. HCNR200和HCNR201在电机驱动和电流回路中的应用
  15. 基于52840 S340协议栈USB flash U盘实现
  16. 华为路由器:清除配置
  17. 5G+急诊救治 - 5G救护车远程会诊智慧医疗解决方案
  18. 100元钱买100只鸡
  19. Centos7常用命令合集
  20. 番茄助手 VS2015

热门文章

  1. VS2008编辑器代码适合的配色方案下载
  2. JQuery使用手册 转载
  3. Nhibernate与代码生成器介绍(转载)
  4. 用哪个版本的基因组和注释文件好?| 亲测
  5. 从VSS到SVN再到Git 记Git的基本操作
  6. python binascii模块详解
  7. c# dev treelist 总结
  8. (前端)html与css css 19、tab栏
  9. Liststring绑定到DataGridView控件
  10. 99%的人都理解错了GET与POST的区别