设计模式之策略模式
设计模式 Java About 1,840 words作用
定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
实质上就是面向对象中的继承和多态。
原理
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
Views: 3,677 · Posted: 2020-01-07
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...