简介
《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("我是印度人");
}
}