Padrão de design do Android - modo de ponte

1. Modo ponte

O padrão Bridge é um padrão de projeto estrutural que separa a abstração da implementação. Ele usa a interface como uma ponte para separar o código de uma classe abstrata de sua classe de implementação para que possam variar independentemente. A ideia central do padrão de ponte é "a composição é melhor que a herança".

Simplificando, a função de uma classe é controlada por duas dimensões, e ambas têm implementações diferentes, que podem ser combinadas à vontade.

Para atingir o objetivo de fazer com que a parte abstrata e a parte de implementação mudem independentemente, a parte abstrata terá o objeto de interface da parte de implementação. Depois de ter o objeto de interface da parte de implementação, a função da parte de implementação específica pode ser chamado através desta interface. A ponte é incorporada no programa como um objeto de interface com a parte abstrata que possui a parte de implementação, realizando um relacionamento de ponte. A ponte no modo ponte é um relacionamento unidirecional e somente a parte abstrata pode usar o objeto da parte de implementação.

2b71f933ef3a4e97b1d338dbba72613d.png

Papel da abstração Abstração: a definição dada pela abstração, que contém uma referência ao objeto realizado.

Papel de Abstração Revisado Abstração Refinada: Estenda o papel de abstração, altere e modifique a definição de abstração pela classe pai.

Implementador de função realizada: fornece a interface da função realizada, mas não fornece uma implementação específica. Observe que essa interface não é necessariamente a mesma que a definição de interface da função abstrata; na verdade, as duas interfaces podem ser muito diferentes. As funções realizadas devem fornecer apenas as operações subjacentes, enquanto as funções abstratas devem fornecer apenas operações de nível superior com base nas operações subjacentes.

ConcreteImplementor: ConcreteImplementor: Implementação concreta da interface do papel realizado.

Parte abstrata:

classe abstrata pública Abstração {

    private Implementor implementor; //A parte abstrata terá o objeto de interface da parte de implementação, e a interface atua como uma ponte, tornando a função da classe de implementação abstrata independente da classe de implementação da interface

    public Abstraction(Implementor implementador

        this.implementador = implementador;

    }

    operação public void() {

        implementador.operaçãoImpl();

    }

}

public class RefinedAbstraction extends Abstraction {

    public RefinedAbstraction(Implementor implementor) {

        super(implementador);

    }

    public void operação refinada() {

        // Estende o método de operação em Abstração

    }

}

Parte de implementação:

interface pública Implementador {

    void operationImpl();

}

public class ConcreteImplementorA implements Implementor{

    @Sobrepor

    public void operationImpl() {

        //Implementação

    }

}

public class ConcreteImplementorB implements Implementor{

    @Sobrepor

    public void operationImpl() {

        //Implementação

    }

}

Através da estrutura, pode-se ver claramente que a classe abstrata Abstraction é como uma ponte conectando RefinedAbstraction e Implementor.

 

2. Cenários de uso do modo bridge

① Se um sistema precisar adicionar mais flexibilidade entre o papel abstrato construído e o papel concreto e evitar estabelecer um relacionamento de herança estático entre os dois níveis, eles podem estabelecer um relacionamento de associação na camada abstrata por meio do modo de ponte.

②Papéis abstratos e papéis realizados podem ser expandidos independentemente no modo de herança sem afetar um ao outro. Quando o programa está em execução, um objeto de uma subclasse abstrata e um objeto de uma subclasse realizada podem ser combinados dinamicamente, ou seja, o sistema precisa Acople dinamicamente os papéis da realização e os papéis da realização.

③ Uma classe tem duas dimensões que mudam independentemente e ambas as dimensões precisam ser expandidas.

④ Embora não haja problema em usar herança no sistema, uma vez que papéis abstratos e papéis concretos precisam mudar independentemente, os requisitos de design precisam gerenciar ambos independentemente.

⑤O modo bridge é especialmente adequado para aqueles sistemas que não desejam usar herança ou o número de classes do sistema aumenta acentuadamente devido à herança multinível.

 

3. Vantagens e desvantagens do modo ponte

1) Vantagens:

①Separação de parte abstrata e parte de implementação

O modo ponte separa a parte abstrata e a parte de implementação, proporcionando grande flexibilidade ao sistema, tornando a parte abstrata e a parte de implementação independentes e definindo interfaces separadamente, o que ajuda o sistema a executar o design hierárquico, resultando em um sistema melhor estruturado . Para a parte de alto nível do sistema, você só precisa conhecer a interface entre a parte abstrata e a parte de implementação.

② Melhor escalabilidade

O modo de ponte define a interface da parte abstrata e da parte de implementação, respectivamente, o que permite que a parte abstrata e a parte de implementação sejam expandidas independentemente sem afetar uma à outra, o que melhora muito a escalabilidade do sistema.

③A comutação dinâmica pode ser realizada

Uma vez que o modo bridge realiza a separação de abstração e implementação, ao implementar o modo bridge, a seleção dinâmica e o uso de implementações específicas podem ser realizados.

④Os detalhes da implementação são transparentes para o cliente e os detalhes da implementação podem ser ocultados do usuário.

2) Desvantagens:

①A introdução do modo ponte aumenta a dificuldade de compreensão e projeto do sistema.Uma vez que o relacionamento de agregação é estabelecido na camada abstrata, os desenvolvedores são obrigados a projetar e programar para a abstração.

②O modo de ponte requer a identificação correta de duas dimensões que mudam independentemente no sistema, portanto, seu escopo de uso tem certas limitações.

 

4. Exemplo de modo ponte

Para entender melhor o padrão de ponte, vejamos um exemplo simples: suponha que temos uma classe de forma, que possui uma propriedade de cor. Neste ponto, se a herança for usada para implementar classes de formas de cores diferentes, muitas subclasses precisam ser criadas, tornando a estrutura do código complexa e difícil de manter. Usando o modo ponte, você pode abstrair a forma e a cor separadamente, de modo que sejam independentes.

interface pública Cor {

    String getColor();

public class Vermelho implementa Cor {

    @Sobrepor

    public String getColor() {

        retornar "vermelho";

    }

}

public class Azul implementa Cor {

    @Sobrepor

    public String getColor() {

        retornar "azul";

    }

}

classe abstrata pública Forma {

    cor de cor protegida;

    público Forma(Cor cor) {

        this.color = cor;

    }

    public abstract void draw();

}

classe pública Retângulo estende Forma {

    public Rectangle(Color color) {

        super(cor);

    }

    @Sobrepor

    public void desenhar() {

        System.out.println("Desenha um retângulo de " + color.getColor() + "");

    }

}

public class Círculo estende Forma {

    public Circle(Cor cor) {

        super(cor);

    }

    @Sobrepor

    public void desenhar() {

        System.out.println("Desenha um círculo de " + color.getColor() + "");

    }

}

No código acima, uma interface de cor é definida primeiro e vermelho e azul são implementados respectivamente. Em seguida, é definida uma classe de forma abstrata, que possui uma propriedade color e um método abstrato draw(). Por fim, as classes concretas de retângulo e círculo são implementadas e um objeto de cor é passado no construtor.

Desta forma, a forma e a cor são abstraídas separadamente para alcançar a dissociação. Quando você precisa criar formas de cores diferentes, basta criar objetos de cores diferentes e passá-los.

 

5. Use no código-fonte do Android

O modo bridge é usado entre Window e WindowManager.

e58182d822ae4e9480fac4fe202cd57b.png

Entre eles, Window e PhoneWindow constituem a parte abstrata da janela, Window é a interface da parte abstrata, PhoneWindow é a implementação concreta e extensão da parte abstrata, WindowManager é a classe base da parte de implementação e WindowManagerImpl é a parte da implementação da lógica específica de implementação, que usa WindowMangerGlobal através da interface IWindowManager se comunica com o WMS e, finalmente, o WMS completa o gerenciamento de janelas específicas. É um modo típico de ponte envolvida.

Acho que você gosta

Origin blog.csdn.net/zenmela2011/article/details/131188344
Recomendado
Clasificación