案例分析:设计模式与代码的结构特性

一、设计模式-适配器模式

  适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

  这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

  适配器模式(Adapter)包含以下主要角色。

  1.目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。

  2.适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。

  3.适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

  其实现方式主要有两种:类适配器和对象适配器。

  类适配器:采用继承实现

  对象适配器:采用对象组合方式实现

二、应用场景

  引用网上一个例子:笔记本电脑电源一般用的都是5V电压,但是我们的家用电是220V,我们要让笔记本充上电,最好的办法应该是通过一个工具把220V的电压转换成5V,这个工具就是适配器。

  首先使用类适配器来实现。先来看看类适配器的UML图。

 

  目标接口Target就相当于上面的5V电压,Adaptee就是被适配的220V电压,Adapter就是适配器。实现代码如下所示。

public interface Target5V{
    void chong5V();
}

被适配电压:220V

public class Adaptee220V{
    public void chong220V(){
        System.out.println("充220V电啦");
    }
}

适配器

public class Adapter extends Adaptee220V implements Target5V{

    @Override
    public void chong5V(){
        System.out.println("充5V电啦");
    }
}

测试

public class Test{
    public static void main(String [] args){
        Adapter adapter = new Adapter();
        adapter.chong5v();
        adapter.chong220V();
    }
}

  其中,Adapter类 继承了 Adaptee220V类 然后实现了接口 Target5V 并实现了目标方法 chong5V(),类适配器的一个特点就是 Adapter 会去继承被适配类,这样适配器就直接拥有了被适配类中的方法,所以类适配器的缺点就是不够灵活,让我们看一下另外一种适配器。

  来看对象适配器,先来看UML类图。

 

 目标

public interface Target5V{
    void chong5V();
}

被适配电压

public class Adaptee220V{
    public void chong220V() {
        System.out.println("充220V电啦");
    }
}

适配器

public class Adater implements Target5V {
    private Adaptee220V adaptee220V;
    
    public Adapter(Adaptee220V adaptee220V) {
        this.adaptee220v = adaptee220v;
    }

    @Override
    public void chong5V() {
        System.out.println("充5V电啦");
    }

    public void chong220V() {
        adaptee220V.chong220V();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Adaptee220V adapee220V = new Adaptee220V();
        Adapter adapter = new Adapter(adaptee220V)
        adapter.chong5V();
        adapter.chong220V();
    }
}
  这里我们把 Adaptee220V 通过 Adapter 的构造方法传入到 Adapter 中,当调用 Adapter 的 chong220V()方法 时,实际是调用传进来 Adaptee220V 对象的 chong220V 方法,这样就会变得很灵活。
三、引入该设计模式后对系统架构和代码结构带来了哪些好处
  适配器模式本来就是为了解决接口之间的不兼容性而产生的,显而易见,引入适配器模式后如果接口不一致只需要改变适配器类中的代码即可。引入适配器模式不仅可以让任何两个没有关联的类一起运行同时提高了类的复用、增加了类的透明度。 并且其灵活性好。
四、解释其中用到的多态机制
  类适配器中:Adapter类 继承了 Adaptee220V类 然后实现了接口 Target5V 并实现了目标方法 chong5V()
五、说明模块抽象封装的方法
  Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
  Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法。
  Adapter(适配器类):通过包装一个需要适配的对象,把原接口转换成目标接口。
六、分析各模块的内聚度和模块之间的耦合度
  由于用了适配器,所以模块之间的耦合度比较低,但因为这里只是简单的使用适配器帮助理解,所以内聚度体现的并不明显。
posted @ 2019-12-08 16:08  ljj18  阅读(165)  评论(0编辑  收藏  举报