Logo Passei Direto
Buscar
O Strategy, que pode também ser chamado de policy (ou política), foi documento pelo GoF como Comportamental. Nele, há uma distribuição de responsabilidades, onde ocorre a aprimoração da comunicação entre objetos. Este pattern busca representar uma "operação" que deva ser realizada sobre elementos de uma estrutura de objetos. Com este padrão, é possível definir novas operações sem a necessidade de alterar as classes destes elementos. De acordo com o catálogo GoF, a meta do Strategy é "Definir uma família de algoritmos, encapsular cada uma delas e torná-las intercambiáveis. Strategy permite que o algoritmo varie independentemente dos clientes que o utilizam."
Qual é o objetivo do padrão de projeto Strategy e como ele beneficia o desenvolvimento orientado a objetos?
User badge image
Desenvolvendo com Questões

mês passado

Respostas

User badge image

Ed Verified user icon

mês passado

O objetivo do padrão de projeto Strategy é definir uma família de algoritmos, encapsular cada um deles em classes separadas e torná-los intercambiáveis, permitindo que o algoritmo varie independentemente dos clientes que o utilizam. Benefícios para o desenvolvimento orientado a objetos: 1. Flexibilidade: Permite alterar o comportamento de um objeto em tempo de execução, escolhendo entre diferentes estratégias (algoritmos) sem modificar o código do cliente. 2. Desacoplamento: Separa a lógica dos algoritmos da classe que os utiliza, facilitando a manutenção e extensão do sistema. 3. Reutilização: Cada algoritmo é implementado em uma classe específica, podendo ser reutilizado em diferentes contextos. 4. Facilidade para adicionar novos algoritmos: Novas estratégias podem ser adicionadas sem alterar as classes existentes, respeitando o princípio aberto/fechado. Em resumo, o padrão Strategy melhora a organização do código, promove a reutilização e facilita a manutenção e evolução do software orientado a objetos.

Essa resposta te ajudou?

0
Dislike0

Ainda com dúvidas?

Envie uma pergunta e tenha sua dúvida de estudo respondida!

Mais perguntas desse material

namespace ComplementarUm_Heranca_Formas
{
abstract class Forma
{
public string Nome { get; set; }
public abstract double Area { get; }
}
}

Veja que definimos a classe de maneira  abstrata , o que impede sua
instanciação. Não teremos objetos do tipo  Forma , pois não temos apenas
formas. Temos retângulos, quadrados, círculos e triângulos, dentre diversas
outras.

Temos definidas duas propriedades, a  Nome  e a  Area , que é abstrata. O
comportamento dela depende de quem especializará a classe  Forma . Note
também que esta última oferece apenas o método  get() , sendo ela uma
propriedade apenas de leitura.

Vamos agora para uma especialização de nossa classe genérica, que
represente uma forma  concreta , um retângulo. Veja o código para essa
classe na sequência, com comentários após ela.

namespace ComplementarUm_Heranca_Formas
{
class Retangulo : Forma
{
public double Base { get; set; }
public double Altura { get; set; }
public override double Area => (Base * Altura);
public bool EhUmQuadrado => Base == Altura;
}
}

Verificou a extensão  :Forma , na assinatura da classe? Não definimos
Nome , pois está em  Forma , mas definimos  Base  e  Altura , que são

específicas para um retângulo. Sobrescrevemos  Area , com  override  e,
utilizando uma  arrow function , implementamos o cálculo para a área de
um retângulo. Concluímos a implementação da classe com a propriedade
EhUmQuadrado , com a qual, com base na igualdade entre  Base  e  Altura ,
poderemos identificar se o retângulo é ou não um quadrado.

Podemos especializar  Forma  para  Circulo  também, o que acha? Veja a
implementação a seguir. Note, nela, que temos a implementação de  Area ,
tal qual tivemos em  Retangulo . E temos também duas propriedades
específicas para  Circulo , pois não são comuns para as demais formas.
O que significa a palavra-chave 'abstract' na definição da classe Forma e qual é a consequência prática de sua utilização no código apresentado?
a) A classe Forma pode ser instanciada diretamente e serve como uma classe base comum.
b) A classe Forma não pode ser instanciada diretamente e deve ser herdada por classes concretas que implementem seus membros abstratos.
c) A classe Forma é uma interface que define apenas assinaturas de métodos.
d) A classe Forma é uma classe estática que não pode ser herdada.

namespace ComplementarDois_Heranca_Interface
{
interface IConta
{
void Creditar(double valor);
void Debitar(double valor);
}
}

O código da classe anterior é simples de entender, já criamos interfaces
antes neste capítulo. Vamos agora para a criação de nossa classe, que será
abstrata. Veja o código dela a seguir, observe o construtor, o que nos obriga
a informar o nome de cada conta instanciada.

namespace ComplementarDois_Heranca_Interface
{
abstract class Conta
{
protected double saldo;
public string Nome { get; set; }
public abstract double SaldoDisponivel { get; }

public Conta(string nome)
{
this.Nome = nome;

}
}
}

Observou no código anterior o uso do modificador de escopo  protected ?
Não havíamos o utilizado ainda. Ele permite que o campo, propriedade ou
método (membros da classe) sejam acessados diretamente pelas subclasses
da classe onde é definido. Em nosso exemplo isso é importante, pois não
poderemos deixar ninguém modificar diretamente o saldo, ou seja, uma
classe que consuma  Conta  ou suas subclasses, mas, as subclasses poderão
acessar diretamente este campo. Não definimos  private  porque a classe
Conta  não implementará nada.
Qual é a função do modificador de acesso 'protected' no campo 'saldo' da classe Conta e por que ele é utilizado neste contexto?
a) Permite que o campo saldo seja acessado apenas dentro da classe Conta, impedindo acesso externo e das subclasses.
b) Permite que o campo saldo seja acessado diretamente pelas subclasses de Conta, mas não por outras classes externas.
c) Permite que o campo saldo seja acessado por qualquer classe no projeto.
d) Torna o campo saldo público e acessível a todos.

namespace ComplementarDois_Heranca_Interface
{
abstract class Conta : IConta
{
protected double saldo;
public string Nome { get; set; }
public abstract double SaldoDisponivel { get; }

public Conta(string nome)
{
this.Nome = nome;
}

public virtual void Creditar(double valor)
{
this.saldo += valor;
}

public virtual void Debitar(double valor)
{
if ((SaldoDisponivel - valor) < 0)
throw new Exception("Saldo insuficiente");
}
}
}

Conseguiu verificar na assinatura que trouxemos para a superclasse a
implementação para a interface? Trouxemos para a classe base algumas
responsabilidades. Mas isso é perigoso, pois as subclasses podem precisar
implementar estes métodos para poderem se tornar concretas e, com essa
implementação, isso não se torna obrigatório.

Agora, verifique a assinatura dos métodos. Notou a palavra  virtual ?
Como vimos anteriormente neste capítulo, isso permite que as classes
especializadas sobrescrevam este método, como implementações
específicas. É possível consumir o código da classe base, implementar
alguma especialidade ou ainda ignorar a implementação da superclasse e
implementar um novo comportamento para o método da subclasse.
Qual é a finalidade do modificador 'virtual' nos métodos Creditar e Debitar da classe Conta e como ele influencia a herança e o polimorfismo?
a) Permite que os métodos sejam sobrescritos nas subclasses para implementar comportamentos específicos, possibilitando polimorfismo.
b) Impede que os métodos sejam sobrescritos nas subclasses.
c) Faz com que os métodos sejam estáticos e não possam ser alterados.
d) Faz com que os métodos sejam privados e inacessíveis às subclasses.

Mais conteúdos dessa disciplina