设计模式之策略模式

设计模式Java大约 1840 字

作用

定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

实质上就是面向对象中的继承和多态。

原理

strategy.png

Context:封装类,对策略进行二次封装,目的是避免高层模块对策略的直接调用。

Strategy:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。

StrategyB:不同功能的策略抽象接口。

ConcreteStrategy:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。

案例

Context

public class Duck {

    FlyBehavior flyBehavior;
    BarkBehavior barkBehavior;

    public Duck(FlyBehavior flyBehavior, BarkBehavior barkBehavior) {
        this.flyBehavior = flyBehavior;
        this.barkBehavior = barkBehavior;
    }

    public void fly() {
        flyBehavior.fly();
    }

    public void bark() {
        barkBehavior.bark();
    }

}

Strategy

public interface FlyBehavior {

    void fly();

}

StrategyB

public interface BarkBehavior {

    void bark();

}

ConcreteStrategy

A/B

public class GoodFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行技术Good!");
    }
}

public class BadFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行技术Bad!");
    }
}

ConcreteStrategy

C/D

public class GaGaBarkBehavior implements BarkBehavior {
    @Override
    public void bark() {
        System.out.println("嘎嘎叫");
    }
}

public class NoBarkBehavior implements BarkBehavior {
    @Override
    public void bark() {
        System.out.println("不会叫");
    }
}

调用

public class Client {
    public static void main(String[] args) {
        Duck duck1 = new Duck(new GoodFlyBehavior(), new GaGaBarkBehavior());
        duck1.fly();
        duck1.bark();
        System.out.println("-----------------");
        Duck duck2 = new Duck(new BadFlyBehavior(), new NoBarkBehavior());
        duck2.fly();
        duck2.bark();
    }
}

源码

Context:java.util.Arrays#sort(T[], java.util.Comparator<? super T>)

Strategy:java.util.Comparator

阅读 231 · 发布于 2020-01-07

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看换一批