设计模式(二)----适配器模式

目录

1.Adapter模式

1.1 作用

1.2 示例程序1---使用继承的适配器

1.2.1 示例程序类图

1.2.2 Banner类

1.2.3 Print接口

1.2.4 PrintBanner类

1.2.5 Main类

1.3 示例程序2---使用委托的适配器

1.3.1 示例程序的类图

1.3.2 Print抽象类

1.3.2 PrintBanner类

1.4 Adapter模式中的角色

1.5 其他特点


1.Adapter模式

1.1 作用

   在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种用于填补“现有的程序”和“所需的程序”之间差异的设计模式就是Adapter模式。

   Adapter模式有以下两种:

        ①适配器模式:使用继承的适配器

        ②对象适配器模式:使用委托的适配器

1.2 示例程序1---使用继承的适配器

1.2.1 示例程序类图

1.2.2 Banner类

   作为现在已有的类。

//当前已有的类
public class Banner {
    private String string;

    public Banner(String string) {
        this.string = string;
    }

    public void showWithParen() {
        System.out.println("(" + string + ")");
    }

    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

1.2.3 Print接口

   作为想要实现新的需求的接口。

//新的接口,想要能够使用已经实现的类的方法
public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

1.2.4 PrintBanner类

   作为适配器类,实现了Print接口,因此有新的需求的方法;继承了Banner类,因此可以使用Banner类中已经实现的方法。

//适配器类,通过这个类来使用已经实现的类的方法
public class PrintBanner extends Banner implements Print{
    public PrintBanner(String string) {
        super(string);
    }

    @Override
    public void printWeak() {
        showWithParen();//使用继承来的Banner类的方法
    }

    @Override
    public void printStrong() {
        showWithAster();
    }
}

1.2.5 Main类

public class Main {
    public static void main(String[] args) {
        Print p = new PrintBanner("hello");
        p.printWeak();
        p.printStrong();
    }
}

   输出:

1.3 示例程序2---使用委托的适配器

   委托是指将某个方法中的实际处理交给其他实例的方法。实例中Banner类和Main类不变,Print从接口变为抽象类,因为只能单一继承,所以此时只能使用委托的方法实现适配。

1.3.1 示例程序的类图

1.3.2 Print抽象类

//新的抽象类,想要能够使用已经实现的类的方法
public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

1.3.2 PrintBanner类

//适配器类,通过这个类来使用已经实现的类的方法
public class PrintBanner extends Print{
    private Banner banner;//关联对象

    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }

    @Override
    public void printWeak() {
        banner.showWithParen();//利用banner对象使用Banner类的方法
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}

1.4 Adapter模式中的角色

  • Target(对象):该角色负责定义所需的方法,即我们当前需要使用的对象。上述的Print。
  • Client(请求者):该角色负责使用Target角色所定义的方法进行具体处理。上述的Main。
  • Adaptee(被适配):是一个持有既定方法的角色,即已经实现的对象,被适配者。上述的Banner。
  • Adapter(适配):该角色负责使用Adaptee角色的方法来满足Target角色的需求。上述的PrintBanner。
  • 类适配器模式的类图(使用继承)

  • 对象适配器模式的类图(使用委托)

1.5 其他特点

  • Adapter模式会对现有的类进行适配,生成新的类,可以实现将现有的类作为新的需求的组件重复使用
  • 使用Adapter模式可以在完全不改变现有代码的前提下使现有代码适配于新的接口。
  • 使用Adapter模式可以使新旧版本兼容,帮助同时维护新版本和旧版本。
  • 注意:当Adaptee角色和Target角色的功能完全不同时,Adapter模式是无法使用的
  • 比如SpringMVC中的HandlerAdapter适配器,针对不同的自定义方法(新的需求)底层有合适的适配器(调用了已有的方法)来实现,这就用到了适配器模式。

根据图解设计模式书籍进行整理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值