Паттерны / Структурные паттерны
image

//Target
trait Text {
    //Request()
    fn get_text(&self) -> String;
}

//Adaptee
struct StringList<'a> {
    rows: Vec<&'a str
}

impl<'a> StringList<'a> {
    //SpecificRequest()
    fn get_string(&self) -> String {
        self.rows.join("\n")
    }

    fn add(&mut self, value: &'a str) {
        self.rows.push(value);
    }
}

//Adapter
struct TextAdapter<'a> {
    row_list: StringList<'a>
}

impl Text for TextAdapter<'_> {
    //Request()
    fn get_text(&self) -> String {
        self.row_list.get_string()
    }
}

fn get_text_adapter<'a>() -> TextAdapter<'a> {
    let mut row_list = StringList { rows: vec![] };
    row_list.add("line 1");
    row_list.add("line 2");
    let adapter = TextAdapter { 
        row_list: row_list };
    adapter
}

//Client
let adapter = get_text_adapter();
let text = adapter.get_text();
//text: line 1
//      line 2 
println!("text:\n{text}");


Преобразует интерфейс класса в другой интерфейс, ожидаемый клиентами. Обеспечивает совместную работу классов, которая была бы невозможна без данного паттерна из-за несовместимости интерфейсов.