1. 程式人生 > >Java設計模式(一)

Java設計模式(一)

val class 特征 advance rect int bsp 分享 工作

Structural patterns 結構型模式

1.適配器模式(Adaptor)

目的:將某個類/接口轉換為client期望的其他形式。適配器讓類可以協同工作,否則就會因為不兼容的接口而無法工作。通過增加 一個接口,將已存在的子類封裝起來,client 面向接口編程,從而隱藏了具體子類。

假設我們有一個MediaPlayer接口和一個實現了 MediaPlayer 接口的實體類 AudioPlayer。默認情況下,AudioPlayer 可以播放 mp3 格式的音頻文件。

我們還有另一個接口 AdvancedMediaPlayer 和實現了 AdvancedMediaPlayer 接口的實體類。該類可以播放 vlc 和 mp4 格式的文件。

要想讓AudioPlayer 播放其他格式的音頻文件。需要一個適配器,這個適配器實現了MediaPayer接口,在這個適配器類裏,用AdvancedMediaPlayer接口,實例化實現它的兩個類,

public class MediaAdapter implements MediaPlayer {

   AdvancedMediaPlayer advancedMusicPlayer;

   public MediaAdapter(String audioType){
      if(audioType.equalsIgnoreCase("vlc") ){
         advancedMusicPlayer = new VlcPlayer();            
      } else if (audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer = new Mp4Player();
      }    
   }

   @Override
   public void play(String audioType, String fileName) {
      if(audioType.equalsIgnoreCase("vlc")){
         advancedMusicPlayer.playVlc(fileName);
      }else if(audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer.playMp4(fileName);
      }
   }
}

然後在正常實現MediaPlayer接口的實體類裏,提供播放其他文件格式的支持,

 1 public class AudioPlayer implements MediaPlayer {
 2    MediaAdapter mediaAdapter; 
 3 
 4    @Override
 5    public void play(String audioType, String fileName) {        
 6 
 7       //播放 mp3 音樂文件的內置支持
 8       if(audioType.equalsIgnoreCase("mp3")){
 9          System.out.println("Playing mp3 file. Name: "+ fileName);            
10       } 
11       //mediaAdapter 提供了播放其他文件格式的支持
12       else if(audioType.equalsIgnoreCase("vlc") 
13          || audioType.equalsIgnoreCase("mp4")){
14          mediaAdapter = new MediaAdapter(audioType);
15          mediaAdapter.play(audioType, fileName);
16       }
17       else{
18          System.out.println("Invalid media. "+
19             audioType + " format not supported");
20       }
21    }   
22 }

裝飾器模式(Decorator)

裝飾器模式是為了解決以下問題出現的一個設計模式:為對象增加不同側面的 特性。 在這種設計模式下,我們對每一個特性構造子類,通過委派機制增加到對象 上。

技術分享圖片

裝飾器 vs. 繼承
? 裝飾器在運行時組成特征;繼承在編譯時組成特征。

? 裝飾器由多個協作對象組成;繼承產生一個明確類型的對象。

? 可以混合和匹配多個裝飾;多重繼承在概念上是困難的。

外觀模式(Facade Pattern)

隱藏系統的復雜性,並向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜性。

創建一個接口。

Shape.java

public interface Shape {
   void draw();
}

創建實現接口的實體類。

Rectangle.java

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Rectangle::draw()");
   }
}

Square.java

public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Square::draw()");
   }
}

Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Circle::draw()");
   }
}

創建一個外觀類。

ShapeMaker.java

public class ShapeMaker {
   private Shape circle;
   private Shape rectangle;
   private Shape square;

   public ShapeMaker() {
      circle = new Circle();
      rectangle = new Rectangle();
      square = new Square();
   }

   public void drawCircle(){
      circle.draw();
   }
   public void drawRectangle(){
      rectangle.draw();
   }
   public void drawSquare(){
      square.draw();
   }
}

使用該外觀類畫出各種類型的形狀。

FacadePatternDemo.java

public class FacadePatternDemo {
   public static void main(String[] args) {
      ShapeMaker shapeMaker = new ShapeMaker();

      shapeMaker.drawCircle();
      shapeMaker.drawRectangle();
      shapeMaker.drawSquare();        
   }
}

Java設計模式(一)