【设计模式】1. 适配器模式、外观模式

适配器模式(Adapter Pattern)


定义:

        Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interface.

        适配器将一个类的接口转换成客户端所期待的另一种接口,让原本因为接口不匹配而无法在一起工作的两个类能在一起工作。

        适配器模式把一个接口或类转换成其他的接口或类;也就是一个包装模式Wrapper:将Adaptee包装成一个Target接口的类。


类图:
  • 对象适配器

如下图。不仅可以适配Adaptee,还可以适配Adaptee的子类。

  • 类适配器

区别是Adapter继承Adaptee,而非关联。

【设计模式】1. 适配器模式、外观模式_第1张图片

三个角色:

1)Target,目标角色

        即客户端所期望的接口。

2)Adaptee,源角色

        是已经存在的,运行良好的类,经过适配器角色的包装,转换为Target

3)Adapter,适配器角色

        核心角色。通过继承或关联,来进行转换。


优点:

  • 可以让两个没有任何关系的类在一起运行
  • 增加了类的透明性,客户端只知道Target
  • 提高了类的复用度
  • 提高灵活性;若某天不想用适配器了,删掉适配器即可;或要换Adaptee,更改适配器即可。


使用场景:

        用于扩展应用中,是一个补救模式,用来解决接口不相容的问题。

        项目一定要遵守依赖倒置原则、里氏替换原则,否则适配器也补救不了!


与其他设计模式的联系:

        Adapter可以包装一个Adaptee,也可以同时包装多个Adaptee!此时要注意与“外观模式”的区别:

  • 适配器模式的意图,是改变接口以符合client的期望。
  • 外观模式的意图,是提供复杂子系统的一个简化接口,让接口更简单。
  • 装饰者模式的意图,是不改变接口,但加入新的行为和责任。

       


外观模式(Facade Pattern)


定义:

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。


类图:

1)通过组合,让外观能够访问子系统中所有组件;

2)将组件整合成一个统一的接口

public class Facade{
    ComonentA a;
    ComonentB b;
    ....
    public void watchMovie(){
        a.on();
        b.start();
        ...
    }    
    public void endMovie(){
        ...
        b.stop();
        a.off();
    }
}


优点:

  • 简化了复杂的接口,客户端只需与外观交流,而无需知道具体的子系统组件;符合 迪米特法则(最少知识原则)。了解更多……
  • 还将客户从组件的子系统中解耦,例如若组件升级,只需要修改外观代码即可,无需修改客户端代码。



你可能感兴趣的:(设计模式)