设计模式 |01 策略模式

本贴最后更新于 1694 天前,其中的信息可能已经天翻地覆

开头说几句

博主博客地址: https://www.jeffcc.top/
设计模式系列是我通过看 Head First 的《设计模式》中学到的知识总结,这是本不错的设计模式入门书籍,强烈推荐!

什么是策略模式

权威定义:策略模式定义了算法簇,使不同的行为分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的对象!
我的理解:将相同的行为共同封装进入超类,不同的行为单独封装,以实现功能!

设计原则

  1. 找到应用中可能需要变化的部分,并且把他们独立起来,通过面向接口的编程方式进行独立划分,不需要和那些不需要变化的代码混合在一起。
  2. 针对接口(超类型)编程,而不是针对实现编程。
  3. 多用组合,少用继承。

模式实例

背景

  1. 需要定义一个鸭子超类,用于显示组合鸭子的共性的行为;
  2. 需要我们定义出一些鸭子的所具有的一些特性:例如飞行和叫声的行为单独接口组合
  3. 实现鸭子的相关正确的行为,(不会出现橡皮鸭会飞等的情况)

代码实现

项目类图

image.png

项目结构

image.png

鸭子的超类
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();
    }
}
输出结果:

image.png


END
2019 年 9 月 2 日 19:55:03

  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...