策略模式
策略模式也是一种好用的模式,可以封装并独立不同的演算法,符合SRP单一职责原则跟OCP开放关闭原则。
透过composition的方式,将演算法放入物件中,并且是宣告为interface,才能写更多concreteStrategy,保留很大的弹性。
结构图:

範例
我们有很多种鸭子,所以宣告一个Abstract Duck,
确定鸭子都会swim()跟display()(一定要display些什么,所以宣告为abstract,必须override)
抽象区
package com.example.designpattern.behavior.strategy;public abstract class Duck { public Duck(){}; private FlyBehavior flyBehavior; // 这边是interface private QuackBehavior quackBehavior; // 这边是interface public abstract void display(); public void swim() { System.out.println("I can swim."); } protected void performFly() { flyBehavior.fly(); } protected void performQuack() { quackBehavior.quack(); } public void setFlyBehavior(FlyBehavior flyBehavior) { // 这里有setter,可以把不同演算法set进物件 this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { // 这里有setter,可以把不同演算法set进物件 this.quackBehavior = quackBehavior; }}
public interface FlyBehavior { void fly();}
public interface QuackBehavior { void quack();}
concrete区
public class GreenDuck extends Duck{ @Override public void display() { System.out.println("I am green."); }}
public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.out.println("fly with wings"); }}
public class Quack implements QuackBehavior{ @Override public void quack() { System.out.println("quack quack quack"); }}
最后来建立鸭子物件吧,并给她适合的fly跟quack演算法
public class DuckClient { public static void main(String[] args) { Duck duck = new GreenDuck(); duck.setFlyBehavior(new FlyWithWings()); // strategy pattern duck.setQuackBehavior(new Quack()); // strategy pattern duck.swim(); duck.performFly(); duck.performQuack(); duck.display(); }}
Reference
https://refactoring.guru/design-patterns/strategy
https://www.oreilly.com/library/view/head-first-design/0596007124/