Java設計模式(一)
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設計模式(一)