架构师的修养3.1 建造者、装饰、适配器、代理模式

建造者模式

将复杂对象的构建和表示分类,隐藏了复杂对象的构建过程,动态创建具有复合属性的对象。

优点:
具体的建造者之间互相独立,利于系统扩展,不影响其他模块
客户端不必知道内部组成细节

缺点:
建造的产品有较多共同点,组成部分相似

使用场景
隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
多个部件都可以装配到一个对象中,但产生的运行结果不相同
产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
初始化一个对象时,参数过多,或者很多参数具有默认值
Builder模式不适合创建差异性很大的产品类
产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

架构师的修养3.1 建造者、装饰、适配器、代理模式

装饰模式

在不改变原有类和使用继承的情况下,动态扩展
优点:
装饰类和被装饰类可以独立发展,而不会相互耦合。它有效地把类的核心职责和装饰功能分开了
装饰模式是继承关系的一个替代方案
装饰模式可以动态地扩展一个实现类的功能
缺点:
多层装饰比较复杂,

场景
需要扩展一个类的功能时
需要动态地给一个对象增加功能,并可以动态地撤销时
需要为一批的兄弟类进行改装或加装功能时

装饰者模式关注的是对象的动态添加功能。代理模式关注的是对对象的控制访问,对它的用户隐藏对象的具体信息。

装饰者模式和被装饰的类要实现同一个接口,或者装饰类是被装饰的类的子类。 适配器模式和被适配的类具有不同的接口。

适配器模式

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
类的适配器模式(使用继承)、对象的适配器模式(使用组合+)、接口的适配器模式。

应用场景

类适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。
根据合成复用原则,组合大于继承。因此,类的适配器模式应该少用。

代理模式

静态代理, 优点,可以扩展功能,缺点,接口改变都需要改变,需要创建代理类较多
动态代理,依赖被代理类的接口,使用反射
CGLIB代理,动态生成被代理类的子类,重新被代理类的方法,