zoukankan      html  css  js  c++  java
  • 设计模式(二)Adapter模式

      Adapter模式也被成为Wrapper模式。适配器模式用于填补“现有的程序”和“所需的程序”之间差异的设计模式。

      Adapter模式有两种,即使用继承的适配器和使用委托的适配器。

      1.使用继承的适配器

      

      下面根据代码来解释使用继承的适配器这种模式。

     1 package BigJunOba.bjtu.Adapter;
     2 
     3 public class Banner {
     4     
     5     private String string;
     6 
     7     public Banner(String string) {
     8         this.string = string;
     9     }
    10     
    11     public void showWithParen() {
    12         System.out.println("(" + string + ")");
    13     }
    14     
    15     public void showWithAster() {
    16         System.out.println("*" + string + "*");
    17     }
    18 }

      这里的Banner类就是现有的程序。有可以对字符串进行操作的showWithParen和showWithAster方法。

    1 package BigJunOba.bjtu.Adapter;
    2 
    3 public interface Print {
    4     
    5     public abstract void printWeak();
    6     public abstract void printStrong();
    7 }

      Print接口声明了两种方法,即加括号printWeak和加星号printStrong方法。这里的Print接口就是实际的需求,现在要做的就是需要一个适配器。

     1 package BigJunOba.bjtu.Adapter;
     2 
     3 public class PrintBanner extends Banner implements Print {
     4 
     5     public PrintBanner(String string) {
     6         super(string);
     7     }
     8 
     9     @Override
    10     public void printWeak() {
    11         showWithParen();
    12     }
    13 
    14     @Override
    15     public void printStrong() {
    16         showWithAster();
    17     }
    18 }

      PrintBanner类就是这个适配器。该类继承了Banner类并且实现了需求。

      PrintBanner类使用showWithParen方法实现了printWeak,使用showWithAster方法实现了printStrong

    package BigJunOba.bjtu.Adapter;
    
    public class Main {
        
        public static void main(String[] args) {
            Print print = new PrintBanner("hhhhh");
            print.printWeak();
            print.printStrong();
        }
    }
    (hhhhh)
    *hhhhh*
    

       通过测试结果我们可以看出使用继承的适配器的作用。

      2.使用委托的适配器

      下面根据代码来解释使用委托的适配器这种模式。

      主要的Main类和Banner类不变。

    1 package BigJunOba.bjtu.Adapter;
    2 
    3 public abstract class Print {
    4     
    5     public abstract void printWeak();
    6     public abstract void printStrong();
    7 }

      将Print接口改成一个抽象类。

     1 package BigJunOba.bjtu.Adapter;
     2 
     3 public class PrintBanner extends Print {
     4     
     5     private Banner banner;
     6     
     7     public PrintBanner(String string) {
     8         this.banner = new Banner(string);
     9     }
    10 
    11     @Override
    12     public void printWeak() {
    13         banner.showWithParen();
    14     }
    15 
    16     @Override
    17     public void printStrong() {
    18         banner.showWithAster();
    19     }
    20     
    21 }

      然后PrintBanner类继承Print抽象类。

      由于在PrintBanner类的banner字段中保存了Banner类的实例,该实例是在PrintBanner类的构造函数中生成的。然后printWeakprintStrong方法会通过banner字段调用banner类的showWithParenshowWithAster方法。这种在执行PrintBanner类的方法时,将处理交给其他实例即Banner实例处理的方式叫委托。

      两种适配器模式的类图。

     

      

    儿女情长什么的,最影响我们闯荡江湖了。
  • 相关阅读:
    大小端判断
    引用计数
    STL_ALGORITHM_H
    书单一览
    GIT版本控制系统(二)
    JS随机数生成算法
    STL学习笔记--临时对象的产生与运用
    乱序优化与GCC的bug
    你的灯亮着吗?
    交换机和路由器
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/8670815.html
Copyright © 2011-2022 走看看