1.定義
策略模式:定義了算法族,分別封裝起來,讓她們可以相互替換。讓算法的變化獨立于使用算法的客體
2.介紹
應用于一件事有多種行為(算法),采用此模式使得系統能夠非常靈活。
3.類圖
image.png
4.實例
package designMode;
import java.io.IOException;
/**
* 策略模式:定義了算法族,分別封裝起來,讓她們可以相互替換。讓算法的變化獨立于使用算法的客體
*/
public class StrategyPattern {
public static void main(String[] args) throws IOException {
Animal bird = new Bird(new BirdMove(),new BirdSound());
Animal bird1 = new Bird();
Animal fish = new Fish(new FishMove(),new FishSound());
bird.performMove();
bird.performSound();
bird.commonbehavior();
bird1.performMove();
bird1.performSound();
bird1.commonbehavior();
fish.commonbehavior();
fish.performSound();
fish.performMove();
}
//抽出公共屬性
static class Animal{
//提出變化部分,封裝算法實現,針對接口編程
private SoundBehavior soundBehavior;
private MoveBehavior moveBehavior;
public void performSound(){
soundBehavior.sound();
}
public void performMove(){
moveBehavior.move();
}
public void commonbehavior(){
System.out.println("公共行為:吃飯睡覺打豆豆!");
}
public void setSoundBehavior(SoundBehavior soundBehavior) {
this.soundBehavior = soundBehavior;
}
public void setMoveBehavior(MoveBehavior moveBehavior) {
this.moveBehavior = moveBehavior;
}
}
static class Bird extends Animal{
//對具體實現進行編程不夠靈活
public Bird() {
super.moveBehavior=new BirdMove();
super.soundBehavior=new BirdSound();
}
//不對具體類編程,在運行時通過多態指定行為實現類
public Bird(MoveBehavior moveBehavior,SoundBehavior soundBehavior) {
super.setMoveBehavior(moveBehavior);
super.setSoundBehavior(soundBehavior);
}
}
static class Fish extends Animal{
public Fish() {
super.moveBehavior=new FishMove();
super.soundBehavior=new FishSound();
}
public Fish(MoveBehavior moveBehavior,SoundBehavior soundBehavior){
super.setMoveBehavior(moveBehavior);
super.setSoundBehavior(soundBehavior);
}
}
//針對行為的方法族
interface SoundBehavior{
void sound();
}
public static class BirdSound implements SoundBehavior{
@Override
public void sound() {
System.out.println("bird sound:嘰嘰喳喳");
}
}
public static class FishSound implements SoundBehavior{
@Override
public void sound() {
System.out.println("fish sound:咕嚕咕嚕");
}
}
interface MoveBehavior{
void move();
}
public static class FishMove implements MoveBehavior{
@Override
public void move() {
System.out.println("fish move:swim");
}
}
public static class BirdMove implements MoveBehavior{
@Override
public void move() {
System.out.println("bird move:fly");
}
}
}