适配器(Adapter)模式

》》用于填补“现有的程序”和“所需的程序”之间的差异的设计模式就是Adapter 模式。

》》Adapter 模式也被称为 Wapper 模式。Wapper 有“包装器”的意思,就像用精美的

       包装纸将普通商品包装成礼物那样,替我们把某样东西包起来,使其能够用于其他

      用途的东西就被称为“包装器”或是”适配器“。

》》Adapter 模式有两种:

       ****类适配器模式(使用继承的适配器)

       ****对象适配器模式(使用委托的适配器)


------------下面的示例程序是一段会将输入的字符串显示为(Hello) 或是 *Hello* 的简单程序


》》先看看使用继承的适配器

         《示例程序的类图》

          

            ---------------------------

                 《Banner 类》

                 package adapter;


public class Banner {
private String string;
public Banner(String string){
this.string = string;
}
//将字符串用括号括起来的showWithParen()
public void showWithParen(){
System.out.println("("+string+")");
}
//将字符串用*号括起来的showWithAster()
public void showWithAster(){
System.out.println("*"+string+"*");
}


}

          --------------------------

            《Print 接口》

             package adapter;


public interface Print {
//弱化字符串显示(加括号)
public abstract void printWeak();
//强调字符串显示(加*号)
public abstract void printStrong();


}

           ---------------------------

            《 PrintBanner 类》

             package adapter;


public class PrintBanner extends Banner implements Print{
public PrintBanner(String string){
super(string);
}

public void printWeak(){
showWithParen();
}
public void printStrong(){
showWithAster();
}


}  

           -----------------------------

            《Main 类》------》测试程序

            package adapter;


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


}

 》》使用委托的适配器

       *****在 Java 语言中,委托就是指将某个方法中的实际处理交给其他实例的方法。

       -----------------------------

        《使用了”对象适配器模式“的示例程序的类图》------》使用委托

        

             ------------------------

             《将上面的示例程序中的   Print 接口,改为 Print 抽象类 》

              package instanceadapter;


public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();


}

          --------------------------

           《修改上面的示例程序 PrintBanner 类,在其中添加一个  Banner 类的实例》

             package instanceadapter;


public class PrintBanner extends Print{
private Banner banner;
public PrintBanner(String string){
this.banner = new Banner(string);
}
public void printWeak(){
banner.showWithParen();
}
public void printStrong(){
banner.showWithAster();
}


}

-----------------------------------------------------------------------------------

      《Adapter 模式中的登场角色》

       **** Target (对象)

               该角色负责定义所需的方法。在上面的示例程序中,Print 接口(使用继承时),

            Print 抽象类(使用委托时)扮演此角色。

       **** Client (请求者)

                该角色负责使用 Target 角色所定义的方法进行具体处理。在示例程序中,Main

           类扮演此角色。

       **** Adaptee (被适配)

                被适配角色是一个持有既定方法的角色。在示例程序中,Banner 类扮演此角色。

       **** Adapter (适配)

               Adapter 模式中的主人公。使用被适配角色的方法来满足 Target 角色的需求,这是

          Adapter 模式的目的,也是  Adapter 角色的作用。在示例程序中,由 PrintBanner 类扮

         演此角色。

       补充:在类适配器模式中,适配角色通过继承来使用被适配角色;而在对象适配器模式

                  中,适配角色通过委托(即被适配的实例)来使用被适配角色。

---------------------------------------------------------

         《扩展思路的要点》

         1.什么时候使用 Adapter 模式

                 Adapter 模式会对现有的类进行适配,生成新的类。通过该模式可以很方便地创建

          我们需要的方法群。当出现 Bug 时,由于我们很明确地知道 Bug 不在现有的类(被适

          配角色)中,所以只需要调查扮演适配角色的类即可。这样一来,代码问题的排查就会

         变得非常简单。

          2.如果没有现成的代码

                 使用 Adapter 模式可以在完全不改变现有代码的前提下使现有代码适配于新的接口。

          此外,在Adapter 模式中,并非一定需要现成的代码。只要知道现有类的功能,就可以

          编写出新的类。

          3.版本升级和兼容性

                可以使用 Adapter 模式使得新旧版本兼容,帮助我们轻松地同时维护新版本和旧版本。

                例如,假设我们今后只想维护新版本。这时可以让新版本扮演被适配的角色,旧版本

                扮演 Target 角色。接着编写一个扮演 适配器角色的类,让它使用新版本的类来实现

                旧版本的类中的方法。

          4.功能完全不同的类

                当被适配角色和 Target 角色的功能完全不同时,Adapter 模式是无法使用的。

----------------------------------------

          《相关的设计模式》

           **** Bridge 模式

           **** Decorator 模式


                  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小达人Fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值