设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)
適配器模式(AdapterPattern, 結(jié)構(gòu)型模式)
用最通俗的講法就是: 將多個(gè)功能相關(guān)或不相關(guān)的接口( 你需要的接口 )放到同一個(gè)實(shí)現(xiàn)類里, 構(gòu)造一個(gè)具有多工功能, 多特點(diǎn)的"異類對(duì)象"
-
定義
是作為多個(gè)接口之間的橋梁,結(jié)合多個(gè)獨(dú)立的接口(將多個(gè)類/功能結(jié)合在一起,構(gòu)建出一個(gè)可以產(chǎn)生需要的對(duì)象的適配器) -
角色關(guān)系
多個(gè)獨(dú)立的接口及其實(shí)現(xiàn)類, 適配器(實(shí)現(xiàn)這多個(gè)目標(biāo)接口) -
優(yōu)點(diǎn)
可以讓多個(gè)個(gè)沒有關(guān)系的接口/類一起運(yùn)行, 提高類的復(fù)用性, 增加類的靈活性 -
缺點(diǎn)
過(guò)多使用適配器造成系統(tǒng)凌亂, 例如:表面上使用A接口,適配器卻將A改為B接口,造成接口使用的混亂, 因此如果不是有必要的, 可以不使用適配器, 而是直接對(duì)系統(tǒng)重構(gòu)
由于java單繼承, 當(dāng)適配類的時(shí)候, 只能適配一個(gè)類(為抽象類);
注: 適配器主要是用與解決正在服役的項(xiàng)目的問(wèn)題, 不是在類詳細(xì)設(shè)計(jì)的時(shí)候添加 (使用適配器, 構(gòu)造出一個(gè)我們想要的對(duì)象, 解決燃眉之急)
- 實(shí)現(xiàn)方式
一般通過(guò)適配器繼承或者以來(lái)已有對(duì)象, 實(shí)現(xiàn)想要的目標(biāo)接口
代碼演示:
例1
將播放MP4與VCL的播放器進(jìn)行適配, 構(gòu)建一個(gè)既能播放MP4, 又能放VCL的播放器
package com.AdapterPattern; /*** 1、系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。* 2、想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來(lái)引進(jìn)的類一起工作,這些源類不一定有一致的接口。* 3、通過(guò)接口轉(zhuǎn)換,將一個(gè)類插入另一個(gè)類系中。* @author regotto**/ public class AdapterPatternDemo1 {public static void main(String[] args) {AudioPlayer ap=new AudioPlayer();ap.play("mp3", "1號(hào)文件");ap.play("vcl", "2號(hào)文件");ap.play("mp4", "3號(hào)文件");} }//最高級(jí)的播放器 interface MediaPlayer{public void play(String audioType,String fileName); }//實(shí)現(xiàn)MediaPlayer, 可播放mp3, 調(diào)用視屏播放的適配器,達(dá)到播放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("文件格式未識(shí)別");} }//播放器適配器(抽取出相同的特性進(jìn)行適配), 將vcl mp4的播放進(jìn)行適配, 得到一個(gè)既能放VCL又能放MP4的一個(gè)播放器 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通過(guò)相同的接口實(shí)現(xiàn),具有一定的共同特征 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
使用老虎對(duì)象, 與fly接口, 通過(guò)適配器構(gòu)造一個(gè)"飛虎對(duì)象"
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");} }結(jié)語(yǔ):
適配器就是將多個(gè)功能結(jié)合在一起, 達(dá)到一個(gè)新的功能, 與建造者模式不同的是, 適配器實(shí)現(xiàn)的接口可以有關(guān)系, 也可以沒有關(guān)系, 建造者模式依賴的是不變的關(guān)系, 變的只是內(nèi)部的零件
上面有錯(cuò), 還請(qǐng)指出, 如果認(rèn)為我寫的還不錯(cuò), 還請(qǐng)點(diǎn)個(gè)贊, 多多支持一下, O(∩_∩)O~~
總結(jié)
以上是生活随笔為你收集整理的设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: tinyxml2遍历所有节点_Pytho
- 下一篇: 设计模式小结