适配器模式和外观模式


录 (?) [+]
  1. 设计模式学习--适配器模式Adapter Pattern外观模式Facade Pattern
    1. 面向对象基础
    2. 面向对象原则
    3. 适配器模式定义
    4. 外观模式定义
    5. 到目前为止我们学习的模式
    6. 关于模式的学习
    7. 关于适配器模式
    8. 再近一点用火鸡来冒充鸭子
    9. 关于外观模式
    10. 一个外观模式的例子家庭电影观赏

设计模式学习--适配器模式(Adapter Pattern)+外观模式(Facade Pattern


面向对象基础

  • 抽象
  • 封装
  • 多态
  • 继承

面向对象原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,不针对实现编程
  • 为交互对象之间的松耦合设计而努力
  • 类应该对扩展开发,对修改关闭
  • 依赖抽象,不要依赖具体类
  • 只和朋友交谈(用来维护设计中的低层解耦)

适配器模式定义

将一个类的接口,转换成客户期望另一个接口。适配器让原本不兼容的类可以合作无间。

外观模式定义

提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。


关于适配器模式

3个对象要清楚:
  • 客户 (客户只看到目标接口)
  • 适配器 (适配器实现目标接口)
  • 被适配者 (所有的请求都委托给被适配器,与适配器组合)

再近一点:用火鸡来冒充鸭子

目标接口
[java] view plain copy print ?
  1. package ducks;  
  2. /** 
  3.  *  
  4.  * @author wwj 
  5.  * 适配器模式:鸭接口 
  6.  */  
  7. public interface Duck {  
  8.     public void quack();        //呱呱叫  
  9.     public void fly();          //飞行  
  10. }  


目标接口具体实现类
[java] view plain copy print ?
  1. package ducks;  
  2.   
  3. /** 
  4.  *  
  5.  *@author wwj 
  6.  *适配器模式:绿头鸭实现类 
  7.  * 
  8.  */  
  9. public class MallardDuck implements Duck {  
  10.   
  11.     @Override  
  12.     public void quack() {  
  13.         System.out.println("Quack");  
  14.     }  
  15.   
  16.     @Override  
  17.     public void fly() {  
  18.         System.out.println("I'm flying");  
  19.     }  
  20.   
  21. }  



被适配对象接口
[java] view plain copy print ?
  1. package ducks;  
  2.   
  3. /** 
  4.  *  
  5.  * @author wwj 
  6.  * 火鸡 
  7.  */  
  8. public interface Turkey {  
  9.     public void gobble();   //咯咯叫  
  10.     public void fly();      //火鸡也会飞,但飞不远  
  11. }  

被适配对象接口具体实现类
[java] view plain copy print ?
  1. package ducks;  
  2.   
  3.   
  4. /** 
  5.  *  
  6.  * @author wwj 
  7.  * 火鸡具体实现类 
  8.  */  
  9. public class WildTurkey implements Turkey {  
  10.   
  11.     @Override  
  12.     public void gobble() {  
  13.         System.out.println("Gobble gobble");  
  14.     }  
  15.   
  16.     @Override  
  17.     public void fly() {  
  18.         System.out.println("I'm flying a short distance");  
  19.     }  
  20.   
  21. }  

适配器
[java] view plain copy print ?
  1. package ducks;  
  2. /** 
  3.  *  
  4.  * @author wwj 
  5.  * 适配器类:用火鸡来冒充鸭子 
  6.  */  
  7. public class TurkeyAdapter implements Duck {  
  8.     Turkey turkey;      //声明你需要适配的引用对象  
  9.       
  10.     /** 
  11.      * 取得需要适配的对象引用,这里通过构造器来取得这个引用 
  12.      * @param turkey 
  13.      */  
  14.     public TurkeyAdapter(Turkey turkey) {  
  15.         this.turkey = turkey;  
  16.     }  
  17.       
  18.     @Override  
  19.     public void quack() { //实现接口中的方法  
  20.         turkey.gobble();    //用适配对象来转换需要实现的功能     
  21.     }  
  22.   
  23.     @Override  
  24.     public void fly() {  
  25.         for(int i = 0; i < 5; i++) {  
  26.             turkey.fly();  
  27.         }  
  28.     }  
  29.   
  30. }  




测试一下
[java] view plain copy print ?
  1. package ducks;  
  2.   
  3. public class TurkeyTestDrive {  
  4.     public static void main(String[] args) {  
  5.         WildTurkey turkey = new WildTurkey(); //创建一只火鸡  
  6.           
  7.           
  8.         MallardDuck duck = new MallardDuck();       //创建一只鸭子  
  9.           
  10.         Turkey duckAdpter = new DuckAdapter(duck);  //传进一个鸭子去,用来假装为火鸡  
  11.           
  12.         //测试鸭子  
  13.         System.out.println("The Duck says...");  
  14.         duck.quack();  
  15.         duck.fly();  
  16.           
  17.           
  18.         //测试火鸡  
  19.         System.out.println("\nThe Turkey says...");  
  20.         testTurkey(turkey);  
  21.           
  22.         //测试适配器  
  23.         System.out.println("\nThe duckAdapter says...");  
  24.         testTurkey(turkey);  
  25.     }  
  26.   
  27.     private static void testTurkey(Turkey turkey) {  
  28.         turkey.gobble();  
  29.         turkey.fly();  
  30.     }  
  31.           
  32. }  

适配器模式测试结果
The Turkey says...
Gobble gobble
I'm flying a short distance


The Duck says...
Quack
I'm flying


The TurkeyAdapter says...
Gobble gobble
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance


好了,以上就是适配器模式的使用,下面是外观模式

关于外观模式

我们需要明白这个模式的意图是什么:简化接口,把复杂的子系统封装起来,可以使用户更加方便使用功能

一个外观模式的例子:家庭电影观赏

构造家庭影院外观
[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class HomeTheaterFacade {  
  4.     //这就是组合,我们会用到的子系统组件全部都在这里  
  5.     Amplifier amp;  
  6.     Tuner tuner;  
  7.     DvdPlayer dvd;  
  8.     CdPlayer cd;  
  9.     Projector projector;  
  10.     TheaterLights lights;  
  11.     Screen screen;  
  12.     PopcornPopper popper;  
  13.       
  14.     /** 
  15.      * 外观将子系统每一个组件的引用都传入它的构造器中。然后外观把它们赋值给相应的实例变量 
  16.      * @param amp 
  17.      * @param tuner 
  18.      * @param dvd 
  19.      * @param cd 
  20.      * @param projector 
  21.      * @param lights 
  22.      * @param screen 
  23.      * @param popper 
  24.      */  
  25.     public HomeTheaterFacade(Amplifier amp, Tuner tuner, DvdPlayer dvd,  
  26.             CdPlayer cd, Projector projector, TheaterLights lights,  
  27.             Screen screen, PopcornPopper popper) {  
  28.         this.amp = amp;  
  29.         this.tuner = tuner;  
  30.         this.dvd = dvd;  
  31.         this.cd = cd;  
  32.         this.projector = projector;  
  33.         this.lights = lights;  
  34.         this.screen = screen;  
  35.         this.popper = popper;  
  36.     }  
  37.       
  38.     /** 
  39.      * 实现简化的接口 
  40.      * @param movie 
  41.      */  
  42.     public void watchMovie(String movie) {  
  43.         System.out.println("Get ready to watch a movie...");  
  44.         popper.on();  
  45.         popper.pop();  
  46.         lights.dim(10);  
  47.         screen.down();  
  48.         projector.on();  
  49.         projector.wideScreenMode();  
  50.         amp.on();  
  51.         amp.setDvd(dvd);  
  52.         amp.setSurroundSound();  
  53.         amp.setVolume(5);  
  54.         dvd.on();  
  55.         dvd.play(movie);  
  56.     }  
  57.    
  58.    
  59.     public void endMovie() {  
  60.         System.out.println("Shutting movie theater down...");  
  61.         popper.off();  
  62.         lights.on();  
  63.         screen.up();  
  64.         projector.off();  
  65.         amp.off();  
  66.         dvd.stop();  
  67.         dvd.eject();  
  68.         dvd.off();  
  69.     }  
  70.   
  71.     public void listenToCd(String cdTitle) {  
  72.         System.out.println("Get ready for an audiopile experence...");  
  73.         lights.on();  
  74.         amp.on();  
  75.         amp.setVolume(5);  
  76.         amp.setCd(cd);  
  77.         amp.setStereoSound();  
  78.         cd.on();  
  79.         cd.play(cdTitle);  
  80.     }  
  81.   
  82.     public void endCd() {  
  83.         System.out.println("Shutting down CD...");  
  84.         amp.off();  
  85.         amp.setCd(cd);  
  86.         cd.eject();  
  87.         cd.off();  
  88.     }  
  89.   
  90.     public void listenToRadio(double frequency) {  
  91.         System.out.println("Tuning in the airwaves...");  
  92.         tuner.on();  
  93.         tuner.setFrequency(frequency);  
  94.         amp.on();  
  95.         amp.setVolume(5);  
  96.         amp.setTuner(tuner);  
  97.     }  
  98.   
  99.     public void endRadio() {  
  100.         System.out.println("Shutting down the tuner...");  
  101.         tuner.off();  
  102.         amp.off();  
  103.     }  
  104.       
  105. }  


各个子系统类的实现
[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class Amplifier {  
  4.     String description;  
  5.     Tuner tuner;  
  6.     DvdPlayer dvd;  
  7.     CdPlayer cd;  
  8.       
  9.     public Amplifier(String description) {  
  10.         this.description = description;  
  11.     }  
  12.    
  13.     public void on() {  
  14.         System.out.println(description + " on");  
  15.     }  
  16.    
  17.     public void off() {  
  18.         System.out.println(description + " off");  
  19.     }  
  20.    
  21.     public void setStereoSound() {  
  22.         System.out.println(description + " stereo mode on");  
  23.     }  
  24.    
  25.     public void setSurroundSound() {  
  26.         System.out.println(description + " surround sound on (5 speakers, 1 subwoofer)");  
  27.     }  
  28.    
  29.     public void setVolume(int level) {  
  30.         System.out.println(description + " setting volume to " + level);  
  31.     }  
  32.   
  33.     public void setTuner(Tuner tuner) {  
  34.         System.out.println(description + " setting tuner to " + dvd);  
  35.         this.tuner = tuner;  
  36.     }  
  37.     
  38.     public void setDvd(DvdPlayer dvd) {  
  39.         System.out.println(description + " setting DVD player to " + dvd);  
  40.         this.dvd = dvd;  
  41.     }  
  42.    
  43.     public void setCd(CdPlayer cd) {  
  44.         System.out.println(description + " setting CD player to " + cd);  
  45.         this.cd = cd;  
  46.     }  
  47.    
  48.     public String toString() {  
  49.         return description;  
  50.     }  
  51. }  

[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class CdPlayer {  
  4.     String description;  
  5.     int currentTrack;  
  6.     Amplifier amplifier;  
  7.     String title;  
  8.   
  9.     public CdPlayer(String description, Amplifier amplifier) {  
  10.         this.description = description;  
  11.         this.amplifier = amplifier;  
  12.     }  
  13.   
  14.     public void on() {  
  15.         System.out.println(description + " on");  
  16.     }  
  17.   
  18.     public void off() {  
  19.         System.out.println(description + " off");  
  20.     }  
  21.   
  22.     public void eject() {  
  23.         title = null;  
  24.         System.out.println(description + " eject");  
  25.     }  
  26.   
  27.     public void play(String title) {  
  28.         this.title = title;  
  29.         currentTrack = 0;  
  30.         System.out.println(description + " playing \"" + title + "\"");  
  31.     }  
  32.   
  33.     public void play(int track) {  
  34.         if (title == null) {  
  35.             System.out.println(description + " can't play track "  
  36.                     + currentTrack + ", no cd inserted");  
  37.         } else {  
  38.             currentTrack = track;  
  39.             System.out.println(description + " playing track " + currentTrack);  
  40.         }  
  41.     }  
  42.   
  43.     public void stop() {  
  44.         currentTrack = 0;  
  45.         System.out.println(description + " stopped");  
  46.     }  
  47.   
  48.     public void pause() {  
  49.         System.out.println(description + " paused \"" + title + "\"");  
  50.     }  
  51.   
  52.     public String toString() {  
  53.         return description;  
  54.     }  
  55. }  

[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class DvdPlayer {  
  4.     String description;  
  5.     int currentTrack;  
  6.     Amplifier amplifier;  
  7.     String movie;  
  8.       
  9.     public DvdPlayer(String description, Amplifier amplifier) {  
  10.         this.description = description;  
  11.         this.amplifier = amplifier;  
  12.     }  
  13.    
  14.     public void on() {  
  15.         System.out.println(description + " on");  
  16.     }  
  17.    
  18.     public void off() {  
  19.         System.out.println(description + " off");  
  20.     }  
  21.   
  22.         public void eject() {  
  23.         movie = null;  
  24.                 System.out.println(description + " eject");  
  25.         }  
  26.    
  27.     public void play(String movie) {  
  28.         this.movie = movie;  
  29.         currentTrack = 0;  
  30.         System.out.println(description + " playing \"" + movie + "\"");  
  31.     }  
  32.   
  33.     public void play(int track) {  
  34.         if (movie == null) {  
  35.             System.out.println(description + " can't play track " + track + " no dvd inserted");  
  36.         } else {  
  37.             currentTrack = track;  
  38.             System.out.println(description + " playing track " + currentTrack + " of \"" + movie + "\"");  
  39.         }  
  40.     }  
  41.   
  42.     public void stop() {  
  43.         currentTrack = 0;  
  44.         System.out.println(description + " stopped \"" + movie + "\"");  
  45.     }  
  46.    
  47.     public void pause() {  
  48.         System.out.println(description + " paused \"" + movie + "\"");  
  49.     }  
  50.   
  51.     public void setTwoChannelAudio() {  
  52.         System.out.println(description + " set two channel audio");  
  53.     }  
  54.    
  55.     public void setSurroundAudio() {  
  56.         System.out.println(description + " set surround audio");  
  57.     }  
  58.    
  59.     public String toString() {  
  60.         return description;  
  61.     }  
  62. }  

[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class PopcornPopper {  
  4.     String description;  
  5.   
  6.     public PopcornPopper(String description) {  
  7.         this.description = description;  
  8.     }  
  9.   
  10.     public void on() {  
  11.         System.out.println(description + " on");  
  12.     }  
  13.   
  14.     public void off() {  
  15.         System.out.println(description + " off");  
  16.     }  
  17.   
  18.     public void pop() {  
  19.         System.out.println(description + " popping popcorn!");  
  20.     }  
  21.   
  22.     public String toString() {  
  23.         return description;  
  24.     }  
  25. }  

[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class Projector {  
  4.     String description;  
  5.     DvdPlayer dvdPlayer;  
  6.       
  7.     public Projector(String description, DvdPlayer dvdPlayer) {  
  8.         this.description = description;  
  9.         this.dvdPlayer = dvdPlayer;  
  10.     }  
  11.    
  12.     public void on() {  
  13.         System.out.println(description + " on");  
  14.     }  
  15.    
  16.     public void off() {  
  17.         System.out.println(description + " off");  
  18.     }  
  19.   
  20.     public void wideScreenMode() {  
  21.         System.out.println(description + " in widescreen mode (16x9 aspect ratio)");  
  22.     }  
  23.   
  24.     public void tvMode() {  
  25.         System.out.println(description + " in tv mode (4x3 aspect ratio)");  
  26.     }  
  27.     
  28.         public String toString() {  
  29.                 return description;  
  30.         }  
  31. }  

[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class Screen {  
  4.     String description;  
  5.       
  6.     public Screen(String description) {  
  7.         this.description = description;  
  8.     }  
  9.    
  10.     public void up() {  
  11.         System.out.println(description + " going up");  
  12.     }  
  13.    
  14.     public void down() {  
  15.         System.out.println(description + " going down");  
  16.     }  
  17.    
  18.     
  19.         public String toString() {  
  20.                 return description;  
  21.         }  
  22. }  


[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class TheaterLights {  
  4.     String description;  
  5.   
  6.     public TheaterLights(String description) {  
  7.         this.description = description;  
  8.     }  
  9.   
  10.     public void on() {  
  11.         System.out.println(description + " on");  
  12.     }  
  13.   
  14.     public void off() {  
  15.         System.out.println(description + " off");  
  16.     }  
  17.   
  18.     public void dim(int level) {  
  19.         System.out.println(description + " dimming to " + level + "%");  
  20.     }  
  21.   
  22.     public String toString() {  
  23.         return description;  
  24.     }  
  25. }  

[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class Tuner {  
  4.     String description;  
  5.     Amplifier amplifier;  
  6.     double frequency;  
  7.   
  8.     public Tuner(String description, Amplifier amplifier) {  
  9.         this.description = description;  
  10.     }  
  11.   
  12.     public void on() {  
  13.         System.out.println(description + " on");  
  14.     }  
  15.   
  16.     public void off() {  
  17.         System.out.println(description + " off");  
  18.     }  
  19.   
  20.     public void setFrequency(double frequency) {  
  21.         System.out.println(description + " setting frequency to " + frequency);  
  22.         this.frequency = frequency;  
  23.     }  
  24.   
  25.     public void setAm() {  
  26.         System.out.println(description + " setting AM mode");  
  27.     }  
  28.   
  29.     public void setFm() {  
  30.         System.out.println(description + " setting FM mode");  
  31.     }  
  32.   
  33.     public String toString() {  
  34.         return description;  
  35.     }  
  36. }  

可以观赏电影啦
[java] view plain copy print ?
  1. package hometheater;  
  2.   
  3. public class HomeTheaterTestDrive {  
  4.     public static void main(String[] args) {  
  5.         Amplifier amp = new Amplifier("Top-O-Line Amplifier");  
  6.         Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp);  
  7.         DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp);  
  8.         CdPlayer cd = new CdPlayer("Top-O-Line CD Player", amp);  
  9.         Projector projector = new Projector("Top-O-Line Projector", dvd);  
  10.         TheaterLights lights = new TheaterLights("Theater Ceiling Lights");  
  11.         Screen screen = new Screen("Theater Screen");  
  12.         PopcornPopper popper = new PopcornPopper("Popcorn Popper");  
  13.           
  14.         HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, tuner, dvd, cd, projector, lights, screen, popper);  
  15.         homeTheater.watchMovie("Raiders of the Lost Ark");  
  16.         homeTheater.endMovie();  
  17.     }  
  18. }  

测试效果:
Get ready to watch a movie...
Popcorn Popper on
Popcorn Popper popping popcorn!
Theater Ceiling Lights dimming to 10%
Theater Screen going down
Top-O-Line Projector on
Top-O-Line Projector in widescreen mode (16x9 aspect ratio)
Top-O-Line Amplifier on
Top-O-Line Amplifier setting DVD player to Top-O-Line DVD Player
Top-O-Line Amplifier surround sound on (5 speakers, 1 subwoofer)
Top-O-Line Amplifier setting volume to 5
Top-O-Line DVD Player on
Top-O-Line DVD Player playing "Raiders of the Lost Ark"
Shutting movie theater down...
Popcorn Popper off
Theater Ceiling Lights on
Theater Screen going up
Top-O-Line Projector off
Top-O-Line Amplifier off
Top-O-Line DVD Player stopped "Raiders of the Lost Ark"
Top-O-Line DVD Player eject
Top-O-Line DVD Player off

你可能感兴趣的:(适配器模式和外观模式)