[Python設計模式] 第17章 程序中的翻譯官——適配器模式

github地址:https://github.com/cheesezh/python_design_patterns

適配器模式

適配器模式,將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作[DP]。

當系統的數據和行為都正確,但是接口不符時,我們應該考慮使用適配器模式,目的就是使控制范圍之外的一個原有對象與某個接口匹配。適配器模式主要應用于希望復用一些現存的類,但是接口又與復用環境要求不一致的情況。

class Target():"""Target類,這是客戶所期待的接口。可以是具體或抽象的類,也可以是接口。"""def request(self):print("普通請求")class Adaptee():"""需要適配的類"""def specific_request(self):print("特殊請求")class Adapter(Target):"""適配器,通過內部包裝一個Adaptee對象,把源接口轉換成目標接口"""def __init__(self):self.adaptee = Adaptee()def request(self):self.adaptee.specific_request()def main():target = Adapter()target.request()main()
特殊請求

何時使用適配器模式?

想使用一個已經存在的類,但如果它的接口,也就是它的方法和你的要求不想同時,就應該考慮使用適配器模式。

對于公司內部獨立開發的系統,類和方法名的規范應當在設計之初就規定好,當接口不相同時,首先不應該考慮使用適配器,而是應該考慮通過重構統一接口。

只有在雙方都不太容易修改的時候再使用適配器模式。

但是如果設計之初,我們準備使用第三方開發組件,而這個組件的接口于我們自己的系統接口是不相同的,而我們也完全沒有必要為了迎合它而改動自己的接口,此時盡管在開發的設計階段,也就是可以考慮用適配器模式來解決接口不同的問題。

題目

用程序模擬姚明到國外打NBA初期依賴翻譯的場景。

from abc import ABCMeta, abstractmethodclass Player():__metaclass__ = ABCMetadef __init__(self, name):self.name = name@abstractmethoddef attack(self):pass@abstractmethoddef defense(self):passclass Forwards(Player):def attack(self):print("Forward {} attack".format(self.name))def defense(self):print("Forward {} defense".format(self.name))class Guards(Player):def attack(self):print("Guards {} attack".format(self.name))def defense(self):print("Guards {} defense".format(self.name))class ForeignCenter():def __init__(self, name):self.name = namedef jingong(self):print("Center {} jingong".format(self.name))def fangshou(self):print("Center {} fangshou".format(self.name))class Translator(Player):def __init__(self, name):self.foreign_center = ForeignCenter(name)def attack(self):self.foreign_center.jingong()def defense(self):self.foreign_center.fangshou()forwards = Forwards("FFF")
forwards.attack()guards = Guards("GGG")
guards.defense()center = Translator("CCC")
center.attack()
center.defense()
Forward FFF attack
Guards GGG defense
Center CCC jingong
Center CCC fangshou

轉載于:https://www.cnblogs.com/CheeseZH/p/9458707.html

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

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

相關文章

Ubuntu中NS2安裝詳細教程

前言: NS2是指 Network Simulator version 2,NS(Network Simulator) 是一種針對網絡技術的源代碼公開的、免費的軟件模擬平臺,研究人員使用它可以很容易的進行網絡技術的開發,而且發展到今天,它…

es6核心特性圖

轉載于:https://juejin.im/post/5c19e188e51d452db4753925

帶你利用一句話完成轉場動畫

這篇文章主要給大家介紹了關于iOS如何利用一句話完成轉場動畫的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧前言本文介紹SS_AnimationTransition 的使用方法,利用…

14.vue路由腳手架

一.vue路由:https://router.vuejs.org/zh/ 1、定義 let router new VueRouter({mode:"history/hash",base:"基本路徑" 加一些前綴 必須在history模式下有效linkActiveClass:"active", 范圍選擇linkExactActiveClass:"exact&qu…

工程師、產品經理、數據工程師是如何一起工作的?

做為一名工程師,免不了與產品經理打交道,如果公司大一些,數據量多一些,還會有數據工程師這個角色。今天會和你主要聊一聊在工作中,產品經理和數據工程師在哪些方面對我們工程師的幫助最大,以及我從他們身上…

linux-buff/cache過大導致內存不足-程序異常

2019獨角獸企業重金招聘Python工程師標準>>> 問題描述 Linux內存使用量超過閾值,使得Java應用程序無可用內存,最終導致程序崩潰。即使在程序沒有掛掉時把程序停掉,系統內存也不會被釋放。 找原因的過程 這個問題已經困擾我好幾個月…

Android 適配(一)

一、Android適配基礎參數1.常見分辨率(px)oppx 2340x1080oppR15 2280x1080oppor11sp 2160*10801080*1920 (主流屏幕16:9)1080*216018:9 手機主流分辨率: 1080*2160高端 16:9 手機主流分辨率: 1080P (1080*1920) 或 2K …

Source Insight 創建工程(linux-2.6.22.6內核源碼)

1. 軟件設置 安裝完Source Insight,需要對其進行設置添加對“.S”匯編文件的支持: 2. 新建linux-2.6.22.6工程 1)選擇工程存放的路徑: 2)下載linux-2.6.22.6內核源碼,并解壓。在Source Insight中 指定源碼的…

課時20:內嵌函數和閉包

目錄: 一、global關鍵字 二、內嵌函數 三、閉包 四、課時20課后習題及答案 ******************** 一、global關鍵字 ******************** 全局變量的作用域是整個模塊(整個代碼段),也就是代碼段內所有的函數內部都可以訪問到全局…

從零開始學產品第六篇:更強大的測試,自動化測試和性能測試

本篇為【從零開始學產品】系列課第1章第5節歡迎到公眾號菜單欄,獲取產品經理課程更多資料 “測試就是拿點鼠標在電腦上瞎點,或者是用手機隨便戳幾下么?” “不,是有計劃有意圖的測試,比如說,邊界測試&#…

Get 了濾鏡、動畫、AR 特效,速來炫出你的短視頻開發特技!

在濾鏡美顏、搞怪特效、炫酷場景等各種新奇玩法驅動下,短視頻開始讓人上癮。 12 月 3 日,七牛云聯合八大短視頻特效平臺共同推出了中國短視頻開發者創意大賽(China Short Video Contest),面向全國邀請廣大開發者&#…

匿名函數、冒泡排序,二分法, 遞歸

匿名函數 lambda 匿名函數 格式 lambda 參數:返回值 函數名統一叫lambda,最多只能寫一行普通的正常的函數 def func(n):return n * n lambda匿名函數寫法 a lambda n : n**2 print(a(3)) 當有多個返回值時suiyi lambda x, y : (1, 2) # 筆試題 …

Redis源碼剖析

Redis源碼剖析和注釋(一)---鏈表結構 Redis源碼剖析和注釋(二)--- 簡單動態字符串 Redis源碼剖析和注釋(三)--- Redis 字典結構 Redis源碼剖析和注釋(四)--- 跳躍表(skiplist) Redis…

Android Activity生命周期

Android生命周期 Android的生命周期:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy() 如下圖所示: 1.當activity啟動時系統會先調用onCreate(),然后調用onStart(),最后調用**onResume()**方法&#xff0…

date數據存入mysql_Date對象存入mysql數據庫

java.sql.Date,java.sql.Time和java.sql.Timestamp三個都是java.util.Date的子類(包裝類)。java.sql.Date是java.util.Date的子類,是一個包裝了毫秒值的瘦包裝器,允許 JDBC 將毫秒值標識為 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以…

盛嚴謹,嚴謹,再嚴謹。_評估員工調查的統計嚴謹性

盛嚴謹,嚴謹,再嚴謹。The human resources industry relies heavily on a wide range of assessments to support its functions. In fact, to ensure unbiased and fair hiring practices the US department of labor maintains a set of guidelines (Uniform Guidelines) to …

復權就是對股價和成交量進行權息修

* 所謂復權就是對股價和成交量進行權息修復,按照股票的實際漲跌繪制股價走勢圖, * 并把成交量調整為相同的股本口徑。股票除權、除息之后,股價隨之產生了變化, * 但實際成本并沒有變化。 * 如:原來20元的股票,十送十之…

前端校驗和后端校驗

問:到底是前端校驗好還是后端校驗好呢? 答:后端校驗比前端校驗更安全,更可靠,前端校驗可以增加用戶體驗,一般來說,在前端校驗的東西在后端也必須校驗(比如登陸用戶名、密碼&#xff…

[MySQL] INFORMATION_SCHEMA 數據庫包含所有表的字段

sql注入后可以通過該數據庫獲取所有表的字段信息1. COLLATIONS表 提供有關每個字符集的排序規則的信息。 COLLATIONS表包含以下列:COLLATION_NAME 排序規則名稱。 CHARACTER_SET_NAME 與排序規則關聯的字符集的名稱。 ID 排序規則ID。 IS_DEFAULT 排序規則是否為其字…

開根號的筆算算法圖解_一個數的開根號怎么計算

一個數的開根號怎么計算2020-11-08 15:46:47文/鐘詩賀帶根號的式子可以直接進行開平方的運算。一些特殊的根號運算有;√2≈1.414、1/2-√3≈0.5-1.732≈-1.232、2√5≈22.236≈4.236、√7-√6≈2.646-2.449≈0.197。開平方的筆算方法1.將被開方數的整數部分從個位起…