设计模式之策略模式
设计模式 Java 大约 1840 字作用
定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
实质上就是面向对象中的继承和多态。
原理
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
阅读 472 · 发布于 2020-01-07
————        END        ————
扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看
换一批
-
java.sql.SQLException: ORA-01000: maximum open cursors exceeded阅读 661
-
短信开发之行业短信阅读 466
-
Android查看签名文件jsk的SHA1,apk签名验证阅读 1583
-
Redis删除数据后内存不释放解决方法阅读 437
-
Android 权限大全阅读 998
-
Elasticsearch全文搜索query->match阅读 534
-
Android VideoView黑屏处理阅读 2629
-
微信小程序开发环境调试接口阅读 1169
-
PostgreSQL修改数据库拥有者阅读 895
-
Spring Boot Undertow上传文件后没有可读权限阅读 2031