Strategy (Assembler) Define uma interface comum para os possíveis algoritmos, sendo usado por Context para chamar o algoritmo definido em uma instância concreta.
ConcreteStrategy (SedanCar, HatchCar) Implementa os algoritmos definidos pela interface Strategy.
Context (Car) Mantém uma referência para um objeto Strategy.
package strategy;
public class SedanCar implements Assembler {
// Atributos de Car que serão modificados durante as etapas do algoritmo.
private String color;
private int bodyWorkVolumesNumber;
private String engineType;
private String tireType;
private String starterMotorType;
// Implementações específicas para cada etapa do algoritmo que constrói um carro Hatch
public void buildCarBodyWork(){
this.bodyWorkVolumesNumber = 3;
}
public void paintCar() {
this.color = "black";
}
public void mountCarParts(){
this.engineType = "W type";
this.tireType = "Summer";
this.starterMotorType = "Planetary Gear";
}
public String getCarInfo(){
return "Number of bodywork volumes: " + this.bodyWorkVolumesNumber
+ "\nCar color: " + this.color
+ "\nEngine type: " + this.engineType
+ "\nTire type: " + this.tireType
+ "\nStarter motor type: " + this.starterMotorType;
}
}
package strategy;
public class Client {
public static void main(String[] args) {
Car car = new Car();
//Instancia uma classe para a execução de um algoritmo SedanCar e passa essa instância para a instância de Car.
SedanCar sedanCar = new SedanCar();
car.setCarAssembler(sedanCar);
car.manufacture();
System.out.println("Car info:");
System.out.println(sedanCar.getCarInfo());
}
}
package strategy;
public class Car {
private Assembler carAssembler;
//Método que executa as etapas de Strategy
public void manufacture(){
carAssembler.buildCarBodyWork();
carAssembler.paintCar();
carAssembler.mountCarParts();
}
public void setCarAssembler(Assembler carAssembler) {
this.carAssembler = carAssembler;
}
}
package strategy;
public interface Assembler {
//Definição das operações abstratas executáveis pelo algoritmo
public abstract void buildCarBodyWork();
public abstract void paintCar();
public abstract void mountCarParts();
}
package strategy;
public class HatchCar implements Assembler {
// Atributos de Car que serão modificados durante as etapas do algoritmo.
private String color;
private int bodyWorkVolumesNumber;
private String engineType;
private String tireType;
private String starterMotorType;
// Implementações específicas para cada etapa do algoritmo que constrói um carro Hatch
public void buildCarBodyWork(){
this.bodyWorkVolumesNumber = 2;
}
public void paintCar() {
this.color = "blue";
}
public void mountCarParts(){
this.engineType = "V type";
this.tireType = "All Season";
this.starterMotorType = "Direct Drive";
}
public String getCarInfo(){
return "Number of bodywork volumes: " + this.bodyWorkVolumesNumber
+ "\nCar color: " + this.color
+ "\nEngine type: " + this.engineType
+ "\nTire type: " + this.tireType
+ "\nStarter motor type: " + this.starterMotorType;
}
}
Strategy (MartialArt): Define uma interface comum para todos os algoritmos apoiados.
ConcreteStrategy (Karate, Judo, Jui-Jitsu): Implementa os algoritmos usando a interface de Strategy.
Context (Fighter): É configurado com um objeto ConcreteStrategy e mantém uma referência para um objeto Strategy.
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public class Judo implements MartialArt {
@Override
public String toAttack() {
return "Judo Ataque!";
}
@Override
public String toDefend() {
return "Judo Defesa!";
}
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public class Karate implements MartialArt {
@Override
public String toAttack() {
return "Karate Ataque!";
}
@Override
public String toDefend() {
return "Karate Defesa!";
}
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public interface MartialArt {
public String toAttack();
public String toDefend();
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public class Client {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//Inicio da luta!!!
BrazilianFighter fighter1 = new BrazilianFighter();
JapaneseFighter fighter2 = new JapaneseFighter();
Karate karat = new Karate();
Judo judo = new Judo();
Jiujitsu jj = new Jiujitsu();
fighter1.setMartialArt(karat);
System.out.println(fighter1.toAttack());
System.out.println(fighter1.toDefend());
fighter1.setMartialArt(judo);
System.out.println(fighter1.toAttack());
System.out.println(fighter1.toDefend());
fighter2.setMartialArt(judo);
System.out.println(fighter2.toAttack());
System.out.println(fighter2.toDefend());
fighter2.setMartialArt(jj);
System.out.println(fighter2.toAttack());
System.out.println(fighter2.toDefend());
//Fim da luta
// Inicio nova Luta!!
}
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public abstract class Fighter {
MartialArt martialArt;
public void setMartialArt(MartialArt martialArt){
this.martialArt = martialArt;
}
public abstract String toAttack();
public abstract String toDefend();
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public class Jiujitsu implements MartialArt {
@Override
public String toAttack() {
return "Jiu-Jitsu Ataque!";
}
@Override
public String toDefend() {
return "Jiu-Jitsu Defesa!";
}
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public class BrazilianFighter extends Fighter {
public BrazilianFighter(){
System.out.println("Lutador Brasileiro!");
}
@Override
public String toAttack() {
return martialArt.toAttack();
}
@Override
public String toDefend() {
return martialArt.toDefend();
}
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package br.padroes.strategyFighter;
/**
*
* @author linus
*/
public class JapaneseFighter extends Fighter{
public JapaneseFighter(){
System.out.println("Lutador Japonês!");
}
@Override
public String toAttack() {
return martialArt.toAttack();
}
@Override
public String toDefend() {
return martialArt.toDefend();
}
}