设计模式:策略模式

15 篇文章 0 订阅
9 篇文章 0 订阅

简介

《Head First设计模式(中文版)》

策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

《百度百科 策略模式》

策略模式是指有一定行动内容的相对稳定的策略名称。

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

策略模式:

  • 定义了一组算法(业务规则);

  • 封装了每个算法;

  • 这族的算法可互换代替(interchangeable)。

具体操作及实现

举例:人类吃饭的方式

整体结构如下所示:

在这里插入图片描述

​ 基类:Person

package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 人类
 * @date 2021/10/11 8:12
 */
public abstract class Person {
    EatBehavior eatBehavior;
    public abstract void display();

    public void setEatBehavior(EatBehavior eatBehavior) {
        this.eatBehavior = eatBehavior;
    }

    /**
     * 执行吃饭的动作
     */
    public void performEat(){
        eatBehavior.eat();
    }
}

接口类:EatBehavior

package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 吃饭的行为
 * @date 2021/10/11 8:14
 */
public interface EatBehavior {
    void eat();
}

具体行为实现类:EatByChopsticks、EatByHand、EatByKnifeAndFork

package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 使用筷子吃饭
 * @date 2021/10/11 8:15
 */
public class EatByChopsticks implements EatBehavior {
    @Override
    public void eat() {
        System.out.println("使用筷子吃饭");
    }
}
package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 用手拿着吃
 * @date 2021/10/11 8:17
 */
public class EatByHand implements EatBehavior{
    @Override
    public void eat() {
        System.out.println("用手拿着吃");
    }
}
package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 使用刀叉吃饭
 * @date 2021/10/11 8:18
 */
public class EatByKnifeAndFork implements EatBehavior {
    @Override
    public void eat() {
        System.out.println("使用刀叉吃饭");
    }
}

具体对象类:Chinese、American、Indian

package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 中国人
 * @date 2021/10/11 8:20
 */
public class Chinese extends Person {

    public Chinese() {
        eatBehavior = new EatByChopsticks();
    }

    @Override
    public void display() {
        System.out.println("我是中国人");
    }
}
package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 美国人
 * @date 2021/10/11 8:24
 */
public class American extends Person {
    public American() {
        eatBehavior = new EatByKnifeAndFork();
    }

    @Override
    public void display() {
        System.out.println("我是美国人");
    }
}
package cn.shentianlan.studytest.designmode.strategy.example;

/**
 * @author 渊蓝
 * @version 1.0
 * @description 印度人
 * @date 2021/10/11 8:23
 */
public class Indian extends Person{

    public Indian() {
        eatBehavior = new EatByHand();
    }

    @Override
    public void display() {
        System.out.println("我是印度人");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值