Design Pattern - Strategy(策略模式),鸭子哌哌

策略模式

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

结构图:
strategy

範例

我们有很多种鸭子,所以宣告一个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/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章