一,前言:
策略模式的注意事项和细节:
- 策略模式的核心思想是:多用组合/聚合,少用继承。
- 遵循 ”开闭原则“,同时避免了多重转换语句。
- 提供了可以替换继承的办法,使得代码易于切换、易于理解、易于扩展。
二,策略模式:
2.1,UML图:
2.2、代码实例:
Step 1) 创建 Duck 抽象类:
public abstract class Duck{
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void dispaly();
public void quack(){
System.out.println("鸭子嘎嘎叫~~");
}
public void swim(){
System.out.println("鸭子会游泳~~");
}
public void fly(){
if(flyBehavior != null) {
flyBehavior.fly();
}
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
Step 2) 创建 PekingDuck 实现类:
class PekingDuck extends Duck {
public PekingDuck() {
flyBehavior = new BadFlyBehavior();
}
@Override
public void dispaly() {
System.out.println("这是北京鸭子~~");
}
}
Step 3) 创建 WilDuck 实现类:
class WilDuck extends Duck {
public WilDuck() {
flyBehavior = new GoodFlyBehavior();
}
@Override
public void dispaly() {
System.out.println("这是野鸭~~");
}
}
Step 4) 创建 ToyDuck 实现类:
class ToyDuck extends Duck {
public ToyDuck() {
flyBehavior = new NoFlyBehavior();
}
@Override
public void dispaly() {
System.out.println("这是玩具鸭~~");
}
public void quack(){
System.out.println("玩具鸭不会嘎嘎叫~~");
}
public void swim(){
System.out.println("玩具鸭不会游泳~~");
}
}
Step 5) 创建 FlyBehavior 接口:
public interface FlyBehavior {
void fly();
}
Step 6) 创建 NoFlyBehavior 实现类:
class NoFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("不会飞翔!");
}
}
Step 7) 创建 BadFlyBehavior 实现类:
class BadFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("飞翔技术一般!");
}
}
Step 8) 创建 GoodFlyBehavior 实现类:
class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞行技术高超!");
}
}
Step 9) 创建 QuackBehavior 接口:
public interface QuackBehavior {
void quack();
}
Step 10) 创建 main 方法:
public class Client {
public static void main(String[] args) {
WilDuck wilDuck = new WilDuck();
wilDuck.fly();
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
System.out.println("===================================");
pekingDuck.setFlyBehavior(new NoFlyBehavior());
System.out.println("改变了北京鸭的飞行能力,北京鸭的实际飞行能力!");
pekingDuck.fly();
}
}
•由 ChiKong_Tam 写于 2020 年 10 月 23 日