前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式|01 策略模式

设计模式|01 策略模式

作者头像
微笑的小小刀
发布2019-09-17 17:07:53
3900
发布2019-09-17 17:07:53
举报
文章被收录于专栏:java技术大本营java技术大本营

开头说几句

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

什么是策略模式

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

设计原则

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

模式实例

背景
  1. 需要定义一个鸭子超类,用于显示组合鸭子的共性的行为;
  2. 需要我们定义出一些鸭子的所具有的一些特性:例如飞行和叫声的行为单独接口组合
  3. 实现鸭子的相关正确的行为,(不会出现橡皮鸭会飞等的情况)
代码实现
项目类图
项目结构
鸭子的超类
代码语言:javascript
复制
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;
    }
}
模型鸭类

代码语言:javascript
复制
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!");
    }
}
叫声行为接口
代码语言:javascript
复制
package main.quack;

/**
 * 叫声行为接口
 */
public interface IQuackBehavior {
    void quack();
}

飞行行为接口

代码语言:javascript
复制
package main.fly;

/**
 * 飞行行为接口
 */
public interface IFlyBehavior {
    void fly();
}
不能飞的实现类
代码语言:javascript
复制
package main.fly.Impl;

import main.fly.IFlyBehavior;

/**
 * 不能飞的实现类
 */
public class FlyNoWayImpl implements IFlyBehavior {
    @Override
    public void fly() {
        System.out.println("I can not fly!");
    }
}

可以飞的实现类
代码语言:javascript
复制
package main.fly.Impl;

import main.fly.IFlyBehavior;

/**
 * 可以飞的实现类
 */
public class FlyWithWingsImpl implements IFlyBehavior {

    @Override
    public void fly() {
        System.out.println("I can fly!");
    }
}

叫声行为接口
代码语言:javascript
复制
package main.quack;

/**
 * 叫声行为接口
 */
public interface IQuackBehavior {
    void quack();
}

不能叫的实现类
代码语言:javascript
复制
package main.quack.Impl;

import main.quack.IQuackBehavior;

/**
 * 不能叫的实现类
 */
public class MuteQuackImpl implements IQuackBehavior {
    @Override
    public void quack() {
        System.out.println("Silence");
    }
}

哇哇叫的实现类
代码语言:javascript
复制
package main.quack.Impl;

import main.quack.IQuackBehavior;

/**
 * 哇哇叫的实现类
 */
public class QuackImpl implements IQuackBehavior {
    @Override
    public void quack() {
        System.out.println("Qucak");
    }
}

呱呱叫的实现类
代码语言:javascript
复制
package main.quack.Impl;

import main.quack.IQuackBehavior;

/**
 * 呱呱叫
 */
public class SqueckImpl implements IQuackBehavior {
    @Override
    public void quack() {
        System.out.println("Squeak");
    }
}
测试类
代码语言:javascript
复制
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();
    }
}
输出结果:
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java技术大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开头说几句
  • 什么是策略模式
  • 设计原则
  • 模式实例
    • 背景
      • 代码实现
        • 项目类图
        • 项目结构
        • 鸭子的超类
        • 模型鸭类
        • 叫声行为接口
        • 不能飞的实现类
        • 可以飞的实现类
        • 叫声行为接口
        • 哇哇叫的实现类
        • 呱呱叫的实现类
        • 测试类
        • 输出结果:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档