设计模式思考(一)策略模式
2018-12-09 本文已影响0人
lhsjohn
策略模式的定义:
策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
OO基础
- 抽象
- 封装
- 多态
- 继承
OO原则
- 封装变化
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
OO模式
- 本篇介绍的是策略模式
策略模式的实例:
下面举一个Duck类的实例来说明策略模式
Duck(鸭子)类是所有类的基类
Public abstract class Duck {
//为行为接口类型声明两个引用变量,所有鸭子子类(在同一个package中)都继承它们。
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
Public Duck() {}
Public abstract void display();
Public void performFly(){
//委托给行为类
flyBehavior.fly();
}
Public void performQuack(){
quackBehavior.quack();
}
Public void swim(){
System.out.println(“所有的鸭子都会游泳”);
}
}
飞行行为接口
public interface FlyBehavior {
public void fly();
}
//这是飞行类的实现,适用于会飞的鸭子
Public class FlyWithWings implements FlyBehavior{
Public void fly(){
System.out.println(“I’m flying!!”);
}
}
//这也是飞行类的实现,给不会飞的鸭子用,如橡皮鸭等
Public class FlyNoWay implements FlyBehavior{
Public void fly(){
System.out.println(“我不会飞”);
}
}
## QuackBehavior 接口及其实现
Public interface QuackBehavior {
Public void quack();
}
Public class Quack implements QuackBehavior{
Public void quack(){
System.out.println(“Quack”);
}
}
Public class MuteQuack implements QuackBehavior{
Public void quack(){
System.out.println(“<< Silence >>”);
}
}
Public class Squeak implements QuackBehavior{
Public void quack() {
System.out.println(“Squeak”);
}
}
下面我们给这些Duck动态设定行为
在Duck 类中加入两个新的方法
Public void setFlyBehavior (FlyBehavior fb)
{
flyBehavior=fb;
}
Public void setQuackBehavior (QuackBehavior qb)
{
quackBehavior =qb;
}
创建一个新的鸭子,模型鸭。
Public class ModelDuck extends Duck{
Public ModelDuck(){
flyBehavior =new FlyNoWay();
quackBehavior=new Quack();
}
Public void display(){
System.out.println(“我是模型鸭”);
}
}
建立一个新的FlyBehavior 类型
Public class FlyRocketPowered implements FlyBehavior {
Public void fly(){
System.out.println(“我是火箭驱动飞行的”);
}
}
测试类进行测试
Public class TestDuck(){
Public static void main(String[] args){
Duck model=new ModelDuck();
//第一次调用performFly()会被委托给flyBehavior对象,也就是FlyNoWay的实例,该对象
//是在模型鸭构造器中设置的
Model.performFly();
//这里调用继承来的setter方法,给它指定特定的飞行行为
Model.setFlyBehavior(new FlyRocketPowered());
Model.performFly();
}
}
测试结果
控制台输出
我不会飞
我是火箭驱动飞行的
下面是相关类和接口的关系图
2018-07-30.png
收集的一些写的有关策略模式的比较好的博客
1.【设计模式--spring源码中使用策略模式(Strategy Pattern)】
https://blog.csdn.net/lzwglory/article/details/51822442
2.【策略模式和Spring的结合在项目中的应用】
https://blog.csdn.net/zlts000/article/details/54754789
3.【设计模式(一)策略模式】
https://www.cnblogs.com/jenkinschan/p/5645300.html
4.【深度剖析策略模式(包括该模式在JDK中的应用)】
https://www.cnblogs.com/lewis0077/p/5133812.html
作者:lhsjohn