设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)
生活随笔
收集整理的這篇文章主要介紹了
设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
適配器模式(AdapterPattern, 結構型模式)
用最通俗的講法就是: 將多個功能相關或不相關的接口( 你需要的接口 )放到同一個實現類里, 構造一個具有多工功能, 多特點的"異類對象"
-
定義
是作為多個接口之間的橋梁,結合多個獨立的接口(將多個類/功能結合在一起,構建出一個可以產生需要的對象的適配器) -
角色關系
多個獨立的接口及其實現類, 適配器(實現這多個目標接口) -
優點
可以讓多個個沒有關系的接口/類一起運行, 提高類的復用性, 增加類的靈活性 -
缺點
過多使用適配器造成系統凌亂, 例如:表面上使用A接口,適配器卻將A改為B接口,造成接口使用的混亂, 因此如果不是有必要的, 可以不使用適配器, 而是直接對系統重構
由于java單繼承, 當適配類的時候, 只能適配一個類(為抽象類);
注: 適配器主要是用與解決正在服役的項目的問題, 不是在類詳細設計的時候添加 (使用適配器, 構造出一個我們想要的對象, 解決燃眉之急)
- 實現方式
一般通過適配器繼承或者以來已有對象, 實現想要的目標接口
代碼演示:
例1
將播放MP4與VCL的播放器進行適配, 構建一個既能播放MP4, 又能放VCL的播放器
package com.AdapterPattern; /*** 1、系統需要使用現有的類,而此類的接口不符合系統的需要。* 2、想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的接口。* 3、通過接口轉換,將一個類插入另一個類系中。* @author regotto**/ public class AdapterPatternDemo1 {public static void main(String[] args) {AudioPlayer ap=new AudioPlayer();ap.play("mp3", "1號文件");ap.play("vcl", "2號文件");ap.play("mp4", "3號文件");} }//最高級的播放器 interface MediaPlayer{public void play(String audioType,String fileName); }//實現MediaPlayer, 可播放mp3, 調用視屏播放的適配器,達到播放mp4, vcl的目的 class AudioPlayer implements MediaPlayer{MediaAdapter ma=null;@Overridepublic void play(String audioType, String fileName) {if(audioType.equals("mp3")) System.out.println("Playing:"+fileName);else if(audioType.equals("vcl") || audioType.equals("mp4")) {ma=new MediaAdapter(audioType);ma.play(audioType, fileName);}else System.out.println("文件格式未識別");} }//播放器適配器(抽取出相同的特性進行適配), 將vcl mp4的播放進行適配, 得到一個既能放VCL又能放MP4的一個播放器 class MediaAdapter implements MediaPlayer{AdvanceMediaPlayer amp=null;public MediaAdapter(String audioType) {if(audioType.equals("vcl")) {amp=new VlcPlayer();}else if(audioType.equals("mp4")) {amp=new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if(audioType.equals("vcl"))amp.playVlc(fileName);else if(audioType.equals("mp4"))amp.playMp4(fileName);}}//播放VCL, MP4, VCL/MP4通過相同的接口實現,具有一定的共同特征 interface AdvanceMediaPlayer{void playVlc(String fileName);void playMp4(String fileName); } class VlcPlayer implements AdvanceMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("Playing: "+ fileName);}@Overridepublic void playMp4(String fileName) {} } class Mp4Player implements AdvanceMediaPlayer{@Overridepublic void playMp4(String fileName) {System.out.println("Playing: "+ fileName);}@Overridepublic void playVlc(String fileName) {} }例2
使用老虎對象, 與fly接口, 通過適配器構造一個"飛虎對象"
package com.AdapterPattern;public class AdapterPatternDemo2 {public static void main(String[] args) {new AnimalAdapter(new Tiger("Atiger", "東北虎")).fly();}}//飛虎 class AnimalAdapter implements Flying{private Animal animal;public AnimalAdapter(Animal animal) {this.animal = animal;}@Overridepublic void fly() {animal.behavior();System.out.println("I can fly");} }abstract class Animal{protected String name;protected String animalType;abstract public void behavior();public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAnimalType() {return animalType;}public void setAnimalType(String animalType) {this.animalType = animalType;}} //老虎 class Tiger extends Animal{public Tiger() {}public Tiger(String name, String animalType) {this.name = name;this.animalType = animalType;}@Overridepublic void behavior() {System.out.println(name+"--"+animalType+"--森林之王");} } interface Flying{void fly(); } //鳥 class Bird extends Animal implements Flying{@Overridepublic void behavior() {System.out.println(name+"--"+animalType);fly();}@Overridepublic void fly() {System.out.println("I can fly");} }結語:
適配器就是將多個功能結合在一起, 達到一個新的功能, 與建造者模式不同的是, 適配器實現的接口可以有關系, 也可以沒有關系, 建造者模式依賴的是不變的關系, 變的只是內部的零件
上面有錯, 還請指出, 如果認為我寫的還不錯, 還請點個贊, 多多支持一下, O(∩_∩)O~~
總結
以上是生活随笔為你收集整理的设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tinyxml2遍历所有节点_Pytho
- 下一篇: 设计模式小结