设计模式(二)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实例处理的方式叫委托。

 

  两种适配器模式的类图。

 

 

 

 

 

 

  

 

posted @ 2018-03-29 16:46  BigJunOba  阅读(186)  评论(0编辑  收藏  举报