------ "Modo Decorador"
Qual é o padrão decorador
O padrão decorator é um padrão de design estrutural que envolve dinamicamente o objeto original. O padrão decorador pode estender dinamicamente suas características funcionais sem alterar a classe original adicionando ou modificando as funções da classe existente. Esse padrão é um padrão wrapper, ou seja, uma maneira de usar a composição do objeto para fornecer aprimoramentos funcionais ao objeto original.
Adicione dinamicamente algumas responsabilidades adicionais a um objeto. O padrão decorator é mais flexível do que subclasses em termos de adição de funcionalidade.
Por que usar o padrão decorador
Geralmente, costumamos usar herança para estender uma classe, porque a herança apresenta recursos estáticos à classe e, com o aumento das funções estendidas, as subclasses serão expandidas.
Usando o padrão decorador, você pode adicionar recursos funcionais a objetos de maneira mais flexível e dinâmica, em vez de implementar extensões funcionais por meio de herança. Usando o padrão decorador, podemos reduzir ao máximo a repetição de código e melhorar a capacidade de reutilização e manutenção do código.
Onde você usa no trabalho
Estenda as classes sem adicionar muitas subclasses.
No Android, o padrão decorator é amplamente utilizado em Drawables de diversas Views no sistema. Por exemplo, podemos usar LayerDrawable para realizar a combinação de vários Drawables e também podemos obter efeitos dinâmicos alterando a transparência, o ângulo de rotação etc.
ideias de design
A ideia central do padrão decorador é estender dinamicamente as características funcionais do objeto por meio de vários decoradores. O padrão decorator tem quatro funções:
1) Componente abstrato (Component): define a interface que o objeto precisa implementar.
2) ConcreteComponent: implementa a interface do componente abstrato e define a implementação básica que precisa ser estendida.
3) Abstract decorator (Decorator): Herdado de Component, precisa conter uma instância de Component, para que a função de Component possa ser estendida.
4) Concrete Decorator (ConcreteDecorator): implementa a interface do abstract decorator, e estende as funções atuais do Component.
Código
O código de implementação de um decorador Drawable comum no Android é dado abaixo:
public class CircleDrawable extends Drawable {
private Paint mPaint;
private Drawable mDrawable;
public CircleDrawable(Drawable drawable) {
mDrawable = drawable;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
}
@Override
public void draw(@NonNull Canvas canvas) {
Rect bounds = getBounds();
canvas.drawCircle(bounds.centerX(), bounds.centerY(),
Math.min(bounds.width(), bounds.height()) / 2, mPaint);
mDrawable.setBounds(bounds);
mDrawable.draw(canvas);
}
@Override
public void setAlpha(int alpha) {
mDrawable.setAlpha(alpha);
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
mDrawable.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return mDrawable.getOpacity();
}
}
Neste exemplo, CircleDrawable é um decorador que contém uma instância de Drawable e estende a função de recorte circular para Drawable. Ao herdar o Drawable e implementar sua interface, o CircleDrawable pode estender dinamicamente os recursos do Drawable e também pode aninhar vários decoradores para obter funções mais complexas.
Resumir
O padrão decorador é um padrão de design flexível e dinâmico para estender a funcionalidade do objeto. No Android, o modo decorador é amplamente utilizado no Drawable of View, para realizar a extensão da aparência, efeito dinâmico e outras características funcionais de vários controles. O padrão decorador realiza a expansão dinâmica das características funcionais por meio de quatro funções, incluindo componentes abstratos, componentes concretos, decoradores abstratos e decoradores concretos. Usando o padrão decorador, podemos reduzir ao máximo a repetição de código e melhorar a capacidade de reutilização e manutenção do código.