1.1 简化java开发
1.1.2 依赖注入

问题:为这个DamselRescuingKnight编写单元测试将出奇地困难。在这样的一个测试中,你必须保证当骑士的embarkOnQuest()方法被调用的时候,探险的embark()方法也要被调用。但是没有一个简单明了的方式能够实现这一点。很遗憾,DamselRescuingKnight将无法进行测试。
耦合具有两面性(two-headed beast)
一方面,紧密耦合的代码难以测试、难以复用、难以理解,并且典型地表现出“打地鼠”式的bug特性(修复一个bug,将会出现一个或者更多新的bug)。
另一方面,一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。总而言之,耦合是必须的,但应当被小心谨慎地管理。
耦合是必须的,不同的类必须以适当的方式进行交互,但是应小心管理。
1.1.3 应用切面
分离关注点,系统由许多不同的组件组成,每一个组件各负责一块特定功能
AOP面向切面编程,允许把遍布各处的功能分离形成可重用的组件,组件之间高内聚低耦合(更加关注自身的业务)。
应用是由那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中,你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。
