开头说几句
博主博客地址: https://www.jeffcc.top/
设计模式系列是我通过看 Head First 的《设计模式》中学到的知识总结,这是本不错的设计模式入门书籍,强烈推荐!
什么是策略模式
权威定义:策略模式定义了算法簇,使不同的行为分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的对象!
我的理解:将相同的行为共同封装进入超类,不同的行为单独封装,以实现功能!
设计原则
- 找到应用中可能需要变化的部分,并且把他们独立起来,通过面向接口的编程方式进行独立划分,不需要和那些不需要变化的代码混合在一起。
- 针对接口(超类型)编程,而不是针对实现编程。
- 多用组合,少用继承。
模式实例
背景
- 需要定义一个鸭子超类,用于显示组合鸭子的共性的行为;
- 需要我们定义出一些鸭子的所具有的一些特性:例如飞行和叫声的行为单独接口组合
- 实现鸭子的相关正确的行为,(不会出现橡皮鸭会飞等的情况)
代码实现
项目类图
项目结构
鸭子的超类
package main;
import main.fly.IFlyBehavior;
import main.quack.IQuackBehavior;
/**
* 模拟策略模式
* 行为对象代替继承
*/
public abstract class Duck {
// 定义一个飞行的行为
private IFlyBehavior flyBehavior;
// 定义一个叫声的行为
private IQuackBehavior quackBehavior;
public Duck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior) {
// 构造函数声明
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
// 鸭子的行为
public abstract void displace();
// 组合一层鸭子的飞行行为,不使用继承
public void performFly(){
flyBehavior.fly();
}
// 组合一层鸭子的叫声行为,不使用继承
public void performQuack(){
quackBehavior.quack();
}
// 手动设置飞行行为
public void setFlyBehavior(IFlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
// 手动设置叫声行为
public void setQuackBehavior(IQuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
模型鸭类
package main;
import main.fly.Impl.FlyNoWayImpl;
import main.quack.Impl.MuteQuackImpl;
/**
* 模型鸭
* 继承鸭子行为
*/
public class ModelDuck extends Duck {
// 给模型鸭设定一个 不能飞 不会叫的行为
public ModelDuck(){
super(new FlyNoWayImpl(),new MuteQuackImpl());
}
@Override
public void displace() {
System.out.println("I am a model duck!");
}
}
叫声行为接口
package main.quack;
/**
* 叫声行为接口
*/
public interface IQuackBehavior {
void quack();
}
飞行行为接口
package main.fly;
/**
* 飞行行为接口
*/
public interface IFlyBehavior {
void fly();
}
不能飞的实现类
package main.fly.Impl;
import main.fly.IFlyBehavior;
/**
* 不能飞的实现类
*/
public class FlyNoWayImpl implements IFlyBehavior {
@Override
public void fly() {
System.out.println("I can not fly!");
}
}
可以飞的实现类
package main.fly.Impl;
import main.fly.IFlyBehavior;
/**
* 可以飞的实现类
*/
public class FlyWithWingsImpl implements IFlyBehavior {
@Override
public void fly() {
System.out.println("I can fly!");
}
}
叫声行为接口
package main.quack;
/**
* 叫声行为接口
*/
public interface IQuackBehavior {
void quack();
}
不能叫的实现类
package main.quack.Impl;
import main.quack.IQuackBehavior;
/**
* 不能叫的实现类
*/
public class MuteQuackImpl implements IQuackBehavior {
@Override
public void quack() {
System.out.println("Silence");
}
}
哇哇叫的实现类
package main.quack.Impl;
import main.quack.IQuackBehavior;
/**
* 哇哇叫的实现类
*/
public class QuackImpl implements IQuackBehavior {
@Override
public void quack() {
System.out.println("Qucak");
}
}
呱呱叫的实现类
package main.quack.Impl;
import main.quack.IQuackBehavior;
/**
* 呱呱叫
*/
public class SqueckImpl implements IQuackBehavior {
@Override
public void quack() {
System.out.println("Squeak");
}
}
测试类
package test;
import main.Duck;
import main.ModelDuck;
import main.fly.Impl.FlyWithWingsImpl;
import main.quack.Impl.QuackImpl;
/**
* 测试类
*/
public class DuckTest{
public static void main(String[] args) {
// 创建一个模型鸭的实例
Duck duck = new ModelDuck();
duck.setFlyBehavior(new FlyWithWingsImpl());
duck.setQuackBehavior(new QuackImpl());
duck.performFly();
duck.performQuack();
duck.displace();
}
}
输出结果:
END
2019 年 9 月 2 日 19:55:03
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于