詳解:設計模式之-適配器模式

分享一波:程序員賺外快-必看的巔峰干貨

簡介

在設計模式中,適配器模式有時候也稱包裝樣式或者包裝。將一個類的接口轉接成用戶所期待的。一個適配使得因接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。
分類

適配器分為,類適配器、對象適配、接口適配方式

類適配器方式采用繼承方式,對象適配方式使用構造函數傳遞

適配器案例

我們就拿日本電飯煲的例子進行說明,日本電飯煲電源接口標準是110V電壓,而中國標準電壓接口是220V,所以要想在中國用日本電飯煲,需要一個電源轉換器
日本110V電源接口

public interface JP110VInterface {

public void connect();

}

日本110V電源實現

public class JP110VInterfaceImpl implements JP110VInterface {

@Override
public void connect() {System.out.println("日本110V,接通電源,開始工作..");
}

}

中國220V電源接口和實現

public interface CN220VInterface {

public void connect();

}

public class CN220VInterfaceImpl implements CN220VInterface {

@Override
public void connect() {System.out.println("中國220V,接通電源,開始工作");
}

}

定義一個電壓適配器

要想在中國使用日本電飯煲,需要把電飯煲110v的電源接口適配成我們220V的電源接口,這就需要一個電源適配器

public class ElectricCooker {

// 日本電飯煲
private JP110VInterface jp110VInterface;
ElectricCooker(JP110VInterface jp110VInterface){this.jp110VInterface=jp110VInterface;
}public void cook(){jp110VInterface.connect();System.out.println("開始做飯了..");
}

}

定義一個電壓適配器,實現110V接口,使這個適配器可以作為參數傳給電飯煲。但是在connect里去執行220V接口的邏輯

public class PowerAdaptor implements JP110VInterface {
private CN220VInterface cn220VInterface;

public PowerAdaptor(CN220VInterface cn220VInterface) {this.cn220VInterface = cn220VInterface;
}@Override
public void connect() {cn220VInterface.connect();
}

}

測試運行

public class AdaptorTest {

public static void main(String[] args) {CN220VInterface cn220VInterface = new CN220VInterfaceImpl();PowerAdaptor powerAdaptor = new PowerAdaptor(cn220VInterface);// 電飯煲ElectricCooker cooker = new ElectricCooker(powerAdaptor);cooker.cook();//使用了適配器,在220V的環境可以工作了。
}

}

適配器應用場景

我們根據上面的適配器的特點的介紹中,我們來分析下適配器模式的幾類比較適用的使用場景:

1、我們在使用第三方的類庫,或者說第三方的API的時候,我們通過適配器轉換來滿足現有系統的使用需求。

2、我們的舊系統與新系統進行集成的時候,我們發現舊系統的數據無法滿足新系統的需求,那么這個時候,我們可能需要適配器,完成調用需求。

3、我們在使用不同數據庫之間進行數據同步。(我這里只是分析的是通過程序來說實現的時候的情況。還有其他的很多種方式[數據庫同步])。

BufferedWriter:是Writer的子類,將輸出的字節流變為字符流。

BufferedReader:是Reader的子類,將輸入的字節流變為字符流。

下面以BufferedReader作為案例,對適配器模式思想進行分析。
Reader類的核心代碼

public abstract class Reader implements Readable, Closeable {

protected Object lock;protected Reader() {this.lock = this;
}protected Reader(Object lock) {if (lock == null) {throw new NullPointerException();}this.lock = lock;
}/*** 讀取字節流*/
public int read() throws IOException {char cb[] = new char[1];if (read(cb, 0, 1) == -1)return -1;elsereturn cb[0];
}

}

BufferedReader核心代碼

public class BufferedReader extends Reader {

private Reader in;/*** 構造中傳入一個Reader,BufferedReader作為Reader的適配器*/
public BufferedReader(Reader in) {this(in, defaultCharBufferSize);
}/*** 校驗適配器中是否有Reader*/
private void ensureOpen() throws IOException {if (in == null)throw new IOException("Stream closed");
}/*** 適配器中的方法,讀取字符流*/
public int read() throws IOException {synchronized (lock) {ensureOpen();for (;;) {if (nextChar >= nChars) {fill();if (nextChar >= nChars)return -1;}if (skipLF) {skipLF = false;if (cb[nextChar] == '\n') {nextChar++;continue;}}return cb[nextChar++];}}
}/*** 按行讀取*/
String readLine(boolean ignoreLF) throws IOException {StringBuffer s = null;int startChar;synchronized (lock) {ensureOpen();boolean omitLF = ignoreLF || skipLF;bufferLoop:for (;;) {if (nextChar >= nChars)fill();if (nextChar >= nChars) {if (s != null && s.length() > 0)return s.toString();elsereturn null;}boolean eol = false;char c = 0;int i;if (omitLF && (cb[nextChar] == '\n'))nextChar++;skipLF = false;omitLF = false;charLoop:for (i = nextChar; i < nChars; i++) {c = cb[i];if ((c == '\n') || (c == '\r')) {eol = true;break charLoop;}}startChar = nextChar;nextChar = i;if (eol) {String str;if (s == null) {str = new String(cb, startChar, i - startChar);} else {s.append(cb, startChar, i - startChar);str = s.toString();}nextChar++;if (c == '\r') {skipLF = true;}return str;}if (s == null)s = new StringBuffer(defaultExpectedLineLength);s.append(cb, startChar, i - startChar);}}
}/*** 關流方法,本質上是關閉Reader的流* 因為BufferedReader僅僅是適配器,本身并不是IO流,所以不存在關流的說法* 因此這里的關流方法是把Reader關閉*/
public void close() throws IOException {synchronized (lock) {if (in == null)return;try {in.close();} finally {in = null;cb = null;}}
}

分享一波:程序員賺外快-必看的巔峰干貨

如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程

請關注微信公眾號:HB荷包
在這里插入圖片描述
一個能讓你學習技術和賺錢方法的公眾號,持續更新

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/537038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537038.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

excel 中編程:vba 入門

2019獨角獸企業重金招聘Python工程師標準>>> 1. 打開編程環境&#xff1a; altF11 打開開發環境 注意需要啟動宏&#xff0c;不然不能執行自定義的程序&#xff0c;保存后文件的后綴應該是&#xff1a;.xlsm 選擇一個 sheet 或一個模塊&#xff0c;右鍵查看代碼&…

android 快傳 源碼_最新安卓仿茄子快傳APP源碼包括服務端源碼Android開發快傳類項目源碼全套...

適使用范圍&#xff1a; 安卓APP茄子快傳源碼 Android項目源碼相似茄子快傳的快傳項目包括服務端運行環境&#xff1a; Android app源碼詳細&#xff1a;本項目是一個基于安卓的相似茄子快傳的項目源碼&#xff0c;包括安卓用戶端源碼&#xff0c;java的PC用戶端和PHP 的web網…

詳解:設計模式之-策略設計模式

分享一波:程序員賺外快-必看的巔峰干貨 什么是策略模式 定義一系列的算法&#xff0c;并將每一個算法單獨進行封裝&#xff0c;而且使它們可以相互替換&#xff0c;從而達到傳遞不同參數而執行不同算法的結果。 策略模式讓算法獨立于使用它的客戶而獨立變化 策略模式應用場…

mysql decode語句_MySQL復制問題的分析

s這是學習筆記的第 2031 篇文章最近有個業務的MySQL復制問題還是比較多&#xff0c;做了事務降維之后&#xff0c;把一些敏感操作和線上環境隔離起來&#xff0c;整體的效果好了許多&#xff0c;不過今天在外面的時候&#xff0c;又收到一條報警短信&#xff0c;讓我心里咯噔一…

jvm形象簡介之一看就懂

分享一波:程序員賺外快-必看的巔峰干貨 據 JVM 規范&#xff0c;JVM 內存結構共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。這里的java內存結構與前面所述的Java內存模型是兩個概念&#xff0c;不可以混淆。 堆 java堆是java虛擬機所管理的內存中最大的一塊…

MZOJ 1345 hero

一道寬搜模版題,可寫錯了兩個地方的我只得了56(掩面痛哭) http://10.37.2.111/problem.php?id1345 先看看正確的 #include <bits/stdc.h> #define read read() #define up(i,l,r) for(int i l; i<r; i) using namespace std;int read {int x 0; char ch getchar()…

opencv拖動進度條_OpenCV GUI基本操作,回調函數,進度條,裁剪圖像等-阿里云開發者社區...

代碼為轉載&#xff0c;出處找不到了&#xff0c;不貼了工具條進度條&#xff1a;// ConvertColor.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include #include #include #pragma comment(lib,"opencv_core2410d.lib")#pragma comment(lib…

區間DP初探 P1880 [NOI1995]石子合并

https://www.luogu.org/problemnew/show/P1880 區間dp,顧名思義,是以區間為階段的一種線性dp的拓展 狀態常定義為$f[i][j]$,表示區間[i,j]的某種解; 通常先枚舉區間長度,再枚舉左端點,最后枚舉斷點(k) 石子合并便是一道經典的區間dp #include <bits/stdc.h> #define read…

jvm詳解 - 新生代與老年代

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 Java 中的堆是 JVM 所管理的最大的一塊內存空間&#xff0c;主要用于存放各種類的實例對象。 在 Java 中&#xff0c;堆被劃分成兩個不同的區…

pymysql建表_Python數據庫操作,針對pymysql 和 MYSQL數據庫

此文將以MYSQL數據庫做為例子,pymysql庫作為驅動進行學習安裝MYSQL數據庫與pymysql第三方庫安裝pymysql庫不多做敘述安裝navicat for mysql,此程序用來管理MYSQL數據庫注意: 連接過程中可能會出現1251錯誤解決辦法,在cmd命令下登錄mysql后輸入:ALTER USER rootlocalhost IDENTI…

從0到1使用VUE-CLI3開發實戰(五):模塊化VUEX及使用vuetify

小肆前幾天發了一篇2019年Vue精品開源項目庫的匯總&#xff0c;今天小肆要使用的是在UI組件中排行第三的Vuetify。vuetify介紹 Vuetify是一個漸進式的框架&#xff0c;完全根據Material Design規范開發&#xff0c;一共擁有80多個組件&#xff0c;對移動端支持非常好。 支持SSR…

詳解垃圾回收算法

分享一波:程序員賺外快-必看的巔峰干貨 標記清除算法 概念 該算法有兩個階段。 標記階段&#xff1a;找到所有可訪問的對象&#xff0c;做個標記。 清除階段&#xff1a;遍歷堆&#xff0c;把未被標記的對象回收 缺點&#xff1a;會產生碎片&#xff0c;不夠連貫 應用場景…

智能情緒分析技術_石化緣推薦:煉化企業智能機器人巡檢技術應用前景分析!...

本期內容由湖南天一奧星泵業有限公司冠名煉化企業智能機器人巡檢技術應用前景分析王國彤1,孫秉才2,儲勝利2,宋亞敏1(1.中國石油天然氣股份有限公司大連石化分公司&#xff0c;遼寧省大連市&#xff1b;2.中國石油集團安全環保技術研究院有限公司&#xff0c;北京市)摘要&#x…

CentOS 7編譯程序后的環境變量設置

今晚在 CentOS 7 上配置 Gitea&#xff0c;配置完成后在本地 clone 倉庫會提示 Failed to execute git command: exec: "git-upload-pack": executable file not found in $PATH&#xff0c;果斷用軟連接打法解決。隨后在 push 時又出現 Failed to execute git comma…

詳解:JVM內存調優參數

分享一波:程序員賺外快-必看的巔峰干貨 -Xms JVM啟動時申請的初始Heap值&#xff0c;默認為操作系統物理內存的1/64但小于1G。默認當空余堆內存大于70%時&#xff0c;JVM會減小heap的大小到-Xms指定的大小&#xff0c;可通過-XX:MaxHeapFreeRation來指定這個比列。Server端JV…

數組指針 sizeof 實現_C++數組指針!

學習C數組的時候&#xff0c;對數組的了解不是很深。也不知道&#xff0c;為什么聲明一個數組&#xff0c;int a[10]&#xff0c;為什么a就是數組的地址。你可以這樣理解&#xff0c;將a理解為指向數組頭的一個指針&#xff0c;這樣就好理解了。理解了之后確實好像豁然開朗的樣…

利用人工智能提升團隊包容性

在2018年11月舉行的Gartner應用技術與解決方案峰會上&#xff0c;高級主管分析師John Kostoulas認為&#xff0c;積極培養包容性文化的團隊和團隊領導者將超越他們的目標。Kostoulas引用了CEB-Gartner在2016年進行的一項領導力驗證調查&#xff0c;他指出&#xff0c;性別多元化…

表單驗證開發 - 登錄注冊開發(3)

表單驗證開發 - 登錄注冊開發(3) 一、教程目標 學習如何在表單中添加驗證規則。掌握使用 JSON 配置表單驗證規則的方法。實現前端和后端的表單驗證。 二、教程內容 1. 前端表單驗證 步驟 1&#xff1a;找到表單編輯 在頁面上找到需要編輯的表單&#xff0c;如注冊表單或登錄…

count(1),count(*),count(主鍵) 性能對比及辟謠

分享一波:程序員賺外快-必看的巔峰干貨 前言 前段時間關于統計數量的sql問題和朋友進行了討論&#xff0c;網上關于這三種查詢方式說法不一&#xff0c;主要有以下兩種說法。 count(*) count(主鍵) > count(1) count(主鍵) > count(*) > count(1)今天對這三種方式…

python與會計的論文_甭管前浪后浪,寫完論文的先浪!

原標題&#xff1a;甭管前浪后浪&#xff0c;寫完論文的先浪&#xff01;自愿返校已是板上釘釘的事兒了而對于大家的期末考現在也基本上已經通知線上考試如果沒有線上考試的話&#xff0c;那就是交論文可是&#xff0c;論文動不動就2000字10%查重毛概、各種選修課等等每一門都是…