Back home

Padrões de design por tutoriais - O poder da OOP (parte 3)

Padrão de adaptador em Swift Padrão de adaptador Swift

Padrões de design por tutoriais - O poder da OOP (parte 3)

Pré-requisitos — Esta série de tutoriais requer um nível intermediário de conhecimento em programação orientada a objetos. Você deve ter conhecimentos básicos sobre classe, objeto, construtor, herança, valor e tipo de referência. Os intermediários ganharão conhecimento e os especialistas aprimorarão seus conhecimentos lendo esta série do início ao fim. Pré-requisito — Esta série de tutoriais requer conhecimento intermediário em programação orientada a objetos. Você deve ter um conhecimento básico de classes, objetos, construtores, herança, valor e tipos de referência. Os usuários intermediários adquirirão conhecimento, enquanto os especialistas aprimorarão seus conhecimentos lendo esta série de capa a capa.

O que é um adaptador?

O que é um adaptador?

Um adaptador é um dispositivo físico que permite que um hardware ou interface eletrônica seja adaptado a outro hardware ou interface eletrônica sem perda de funcionalidade. Um adaptador é um dispositivo físico que permite que um hardware ou interface eletrônica seja adaptado a outro hardware ou interface eletrônica sem perda de funcionalidade.

Adaptadores são usados ​​quando você tem uma forma de entrada e deseja acessar algo que não pode assumir sua forma de entrada. Adaptadores são usados ​​quando você tem uma forma de entrada e deseja acessar algo que não pode assumir a forma de sua entrada.

Agora é hora de entender o padrão do adaptador respondendo às perguntas simples abaixo. Agora, entenda o padrão do adaptador respondendo às perguntas simples abaixo.

  1. Qual é o padrão Adaptador na programação orientada a objetos? Qual é o padrão do adaptador na programação orientada a objetos?

  2. Que problema isso resolve? Que problema isso resolve?

  3. Como podemos usá-lo na programação? Como podemos usá-lo na programação?

Qual é o padrão Adapter na programação orientada a objetos?

Qual é o padrão do adaptador na programação orientada a objetos?

No padrão do adaptador, definimos uma classe que usa o tipo existente como entrada e nos fornece o tipo necessário ou as funcionalidades/propriedades necessárias para acessar. No padrão Adaptador, definimos uma classe que aceita um tipo existente como entrada e nos fornece o tipo necessário ou funcionalidades/propriedades necessárias para acessar.

Que problema isso resolve?

Que problema isso resolve?

Ajuda a converter tipos de dados existentes em outra forma de dados. Ajuda a converter tipos de dados existentes em outra forma de dados.

Isso é muito útil quando usamos código de estruturas ou bibliotecas de terceiros e aceita apenas tipos restritos. Isso é muito útil quando usamos código de uma estrutura ou biblioteca de terceiros e aceita apenas tipos restritos.

Como podemos usá-lo na programação?

Como podemos usá-lo na programação?

Vamos entender isso com o exemplo abaixo. Vamos entender isso através do exemplo a seguir.

Temos classes como Point, LineSegment e DrawingPad . Temos as classes Point, LineSegment e DrawingPad.

Lembra-se dos nossos velhos tempos de computação gráfica usando linguagem C? Lembra-se da época em que usávamos a linguagem C para fazer computação gráfica? Dessa vez, apenas para desenhar uma linha na tela, temos que calcular todos os pontos da linha entre dois pontos dados. Para calcular pontos de linha, existem vários algoritmos básicos disponíveis, como algoritmo de desenho de linha simples, algoritmo DDA, algoritmo de linha de Bresenham, etc. Para desenhar uma linha na tela, precisamos contar todos os pontos entre dois pontos desta linha. Para calcular os pontos de uma linha reta, existem muitos algoritmos básicos que podem ser usados, como algoritmo de desenho de linha reta simples, algoritmo DDA, algoritmo de linha reta de Bresenham, etc. Manteremos nosso código de exemplo limpo e fácil de entender para o padrão do adaptador, sem escrever esses algoritmos complexos aqui. Para o padrão do adaptador, manteremos o código de exemplo simples e fácil de entender, sem escrever algoritmos tão complexos aqui.

// Hitendra Solanki
// Adapter design pattern Playground example
import Foundation

class Point {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

class LineSegment {
    var startPoint: Point
    var endPoint:   Point
    
    init(startPoint: Point, endPoint: Point) {
        self.startPoint = startPoint
        self.endPoint = endPoint
    }
}

//Mark:- DrawingPad
//  This is just to make example more interesting
//  We are just printing the point on Console to make it simple
class DrawingPad {
    //Draw Single point, main drawing method
    func draw(point: Point) {
        print(".")
    }
    
    //Draw multiple points
    func draw(points: [Point]) {
        points.forEach { (point) in
            self.draw(point: point)
        }
    }
}



func main(){
    let drawingPad = DrawingPad()
    
    let point1 = Point(x: 10, y: 10)
    
    drawingPad.draw(point: point1)
}

//call main function to execute code
main()


// AdapterPattern_intro.swift 

No exemplo acima

No exemplo acima

Linha 6, classe Point representa um único ponto. Linha 6, classe Point representa um ponto.

Linha 16, classe LineSegment representa um segmento de linha. Linha 16, classe LineSegment representa um segmento de linha.

Linha 29, classDrawingPad representa uma tela para desenho. O DrawingPad pode desenhar um ou vários pontos em uma tela. Linha 29, classe DrawingPad representa uma tela usada para desenho. O DrawingPad pode desenhar um ou vários pontos na tela.

Podemos desenhar um ponto neste exemplo, mas não podemos desenhar um segmento de linha diretamente na tela usando uma instância de bloco de desenho. Aqui o padrão do adaptador vem em socorro, graças ao padrão do adaptador. Podemos desenhar um ponto neste exemplo, mas não podemos desenhar um segmento de linha diretamente na tela usando uma instância de prancheta. Aqui, o padrão do adaptador entra em ação, graças ao padrão do adaptador.

// Hitendra Solanki
// Adapter design pattern Playground example
import Foundation

class Point {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

class LineSegment {
    var startPoint: Point
    var endPoint:   Point
    
    init(startPoint: Point, endPoint: Point) {
        self.startPoint = startPoint
        self.endPoint = endPoint
    }
}

//Mark:- DrawingPad
//  This is just to make example more interesting
//  We are just printing the point on Console to make it simple
class DrawingPad {
    //Draw Single point, main drawing method
    func draw(point: Point) {
        print(".")
    }
    
    //Draw multiple points
    func draw(points: [Point]) {
        points.forEach { (point) in
            self.draw(point: point)
        }
    }
}

//Mark: LineSegmentToPointAdapter
//  This is responsible to generate all points exists on LineSegment
class LineSegmentToPointAdapter {
    var lineSegment: LineSegment
    init(lineSegment: LineSegment) {
        self.lineSegment = lineSegment
    }
    func points() -> Array<Point> {
        //To make things simple, without complex line drawing algorithms,
        //This will only work for points like below
        //(10,10) to (20,20)
        //(34,34) to (89,89)
        //(x,y) to (p,q) where y=x and q=p i.e. (x,x) to (p,p) just to make it simple for this demo
        
        var points: Array<Point> = []
        let zipXY = zip(
            (self.lineSegment.startPoint.x...self.lineSegment.endPoint.x),
            (self.lineSegment.startPoint.y...self.lineSegment.endPoint.y)
        )
        for (x,y) in zipXY {
            let newPoint = Point(x: x, y: y)
            points.append(newPoint)
        }
        return points
    }
    
}




func main(){
    let drawingPad = DrawingPad()
    
    //Remeber: (x,y) to (p,q) where y=x and q=p => (x,x) to (p,p) for our points logic to work
    
    //create lineSegment
    let startPoint = Point(x: 2, y: 2)
    let endPoint = Point(x: 10, y: 10)
    let lineSegment = LineSegment(startPoint: startPoint, endPoint: endPoint)
    
    //create adapter
    let adapter = LineSegmentToPointAdapter(lineSegment: lineSegment)
    
    //get points from adapter to draw
    let points = adapter.points()
    
    drawingPad.draw(points: points) //it will draw total 9 dots on console
}

//call main function to execute code
main()

//AdapterPattern_simpleSolution.swift

Line45, classe LineSegmentToPointAdapter representa um adaptador que é o conceito central deste artigo. Ele pega o tipo existente LineSegment como entrada e nos fornece uma matriz de pontos em nosso caso. Line45, classe Linesegmenttopadapter representa um adaptador, que é o conceito central deste artigo. Ele recebe como entrada um tipo existente LineSegment e nos fornece uma matriz de pontos neste caso.

###Conclusão Conclusão

  1. Um adaptador é qualquer classe que usa um objeto como parâmetro no construtor. Um adaptador é qualquer classe que aceita um objeto como parâmetro em seu construtor.

  2. Uma classe adaptadora possui propriedades/métodos que podemos usar como o tipo necessário. A classe do adaptador possui propriedades/métodos que podem ser usados ​​como o tipo necessário.

  3. Um adaptador também pode atuar diretamente em um tipo necessário, que depende da implementação. Os adaptadores também podem reproduzir diretamente o tipo necessário, dependendo da implementação.Esta é apenas uma implementação simples do padrão adaptador na programação orientada a objetos usando Swift. Mas espere, tem algo mais e avança nesse padrão. Esta é apenas uma implementação simples do padrão Adapter na programação orientada a objetos usando Swift. Mas espere, há muito mais coisas e progressão neste modo.

O padrão de design do adaptador é mais poderoso com…. O padrão de design do adaptador é ainda mais poderoso…

Mais conteúdo em breve… Mais em breve…

Clique para visualizar o texto original: https://medium.com/flawless-app-stories/adapter-pattern-design-patterns-by-tutorials-the-power-of-oop-part-3-112a956c1101