Rust語言之GoF設計模式:介面卡Adapter
介面卡是一種結構設計模式,它能讓具有不相容介面的物件進行協作。
這裡案例中:有一個call函式只接受介面 (trait)為Target的引數:
fn call(target: impl Target); |
如果有一個介面型別是SpecificTarget 作為需要作為引數傳入怎麼辦?
將這個SpecificTarget 轉換為Target。
就像將110伏插頭轉為220伏電壓插頭,這樣只能使用220伏的電器透過適配插頭就可以使用110伏電,這是去日本旅遊需要攜帶轉壓器的原因、
下面看看第一個介面trait:這是我們call函式可以接受的介面
pub trait Target { fn request(&self) -> String; } pub struct OrdinaryTarget; impl Target for OrdinaryTarget { fn request(&self) -> String { "Ordinary request.".into() } } |
但是,現在我們只有SpecificTarget這個介面,要傳給call函式:
pub struct SpecificTarget; impl SpecificTarget { pub fn specific_request(&self) -> String { ".tseuqer cificepS".into() } } |
那麼,就需要一個適配轉換器將SpecificTarget轉換為Target:
use crate::{adaptee::SpecificTarget, Target}; ///將adaptee的'SpecificTarget'轉換為相容的`Target`輸出 pub struct TargetAdapter { adaptee: SpecificTarget, } impl TargetAdapter { pub fn new(adaptee: SpecificTarget) -> Self { Self { adaptee } } } impl Target for TargetAdapter { fn request(&self) -> String { // 這裡是將原來的specific輸出 "改編 "為相容Target的輸出。 self.adaptee.specific_request().chars().rev().collect() } } |
上面三個程式碼已經完成介面卡結構,下面是客戶端呼叫:
mod adaptee; mod adapter; mod target; use adaptee::SpecificTarget; use adapter::TargetAdapter; use target::{OrdinaryTarget, Target}; /// 只能呼叫 "Target "介面的call函式 /// /// 為了更好地理解介面卡模式,想象一下這是 /// 一個客戶端程式碼,它只能在一個特定的介面上操作 /// (`Target` trait only)。這意味著一個不相容的介面不能被 /// 在沒有介面卡的情況下傳遞到這裡。 fn call(target: impl Target) { println!("'{}'", target.request()); } fn main() { let target = OrdinaryTarget; print!("相容於target的任何引數都能直接被呼叫: "); call(target); let adaptee = SpecificTarget; println!( "Adaptee 與客戶端不相容: '{}'", adaptee.specific_request() ); let adapter = TargetAdapter::new(adaptee); print!("但是使用 adapter 以後,客戶端可以呼叫call函式了: "); call(adapter); } |
相關文章
- Rust語言之GoF設計模式: 模板方法模式RustGo設計模式
- Rust語言之GoF設計模式:原型模式RustGo設計模式原型
- Rust語言之GoF設計模式:迭代器模式RustGo設計模式
- Rust語言之GoF設計模式:工廠模式RustGo設計模式
- Rust語言之GoF設計模式:Flyweight享元模式RustGo設計模式
- Rust語言之GoF設計模式:責任鏈模式RustGo設計模式
- Rust語言之GoF設計模式:中介者Mediator模式RustGo設計模式
- Rust語言之GoF設計模式:抽象工廠模式RustGo設計模式抽象
- Rust語言之GoF設計模式:備忘錄Memento模式RustGo設計模式
- Rust語言之GoF設計模式: 直譯器Interpreter模式RustGo設計模式
- Rust語言之GoF設計模式:靜態工廠RustGo設計模式
- Go語言實現GoF設計模式:介面卡模式Go設計模式
- PHP設計模式-Adapter 介面卡模式PHP設計模式APT
- 《設計模式》 - 5. 介面卡模式( Adapter )設計模式APT
- 設計模式之介面卡模式(adapter pattern)設計模式APT
- Scala 與設計模式(五):Adapter 介面卡模式設計模式APT
- C#設計模式-介面卡模式(Adapter Pattern)C#設計模式APT
- 人人都會設計模式:介面卡模式--Adapter設計模式APT
- 12/24 設計模式之介面卡模式 Adapter Pattern設計模式APT
- 一天一個設計模式(五) - 介面卡模式(Adapter)設計模式APT
- 介面卡模式(adapter pattern)模式APT
- Adapter-介面卡模式APT模式
- 設計模式系列之介面卡模式(Adapter Pattern)——不相容結構的協調設計模式APT
- 設計模式:介面卡模式設計模式
- 設計模式-介面卡模式設計模式
- 設計模式----介面卡模式設計模式
- 【設計模式】介面卡模式設計模式
- GoF設計模式中裝飾器、代理與介面卡的區別與聯絡 - MarioGo設計模式
- 實踐GoF的23種設計模式:命令模式Go設計模式
- 介面卡設計模式設計模式
- GOF23--23種設計模式(一)Go設計模式
- Java設計模式之介面卡設計模式Java設計模式
- 設計模式--介面卡模式/代理模式設計模式
- python 設計模式-介面卡模式Python設計模式
- 設計模式之介面卡模式設計模式
- JavaScript 設計模式 —— 介面卡模式JavaScript設計模式
- java設計模式-介面卡模式Java設計模式
- 設計模式(七)介面卡模式設計模式