策略模式的定义与特点
分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。业此模式让行为算法的变化独立于算法的使用者。
场景案例
人都会思考,吃饭,睡觉。但是有的人会说话,有的人不会(宝宝),而且说话的语言也不一样,有的说中文,有的说德语,有 的说韩语 。同样有的人有工作,有的人没有工作(孩子),而且工作的内容也不一样,有厨师,有码农,有教师。
面对这种场景,往往就是 ,因为都会吃饭,睡觉和思考,所以先写一个 超类 人,然后有吃饭,睡觉和思考的方法,然后讲说话 和工作抽象为接口,有需要就自己实现。
- 策略模式
对于思考吃饭睡觉,都是共有的,直接写在person内,对于说话和工作的行为,单独抽取成:行为两个接口,并对这两个接口分别进行算法族实现(即:一系列实现)。创建person,父类person 可以思考睡觉吃饭,还拥有两个接口,一个是说话,一个是工作。每个单独的人 需要对两个接口提供不同的策略实现,如果需求有变动,还可以通过setter方法进行更改。
代码实现
package strategy;
/**
* 说话行为
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/9 16 29
*/
public interface SpeakBehavior {
/**
* 说话
*/
void talk();
}
package strategy;
/**
* 说中文
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/11 09 31
*/
public class SpeakEnglish implements SpeakBehavior{
@Override
public void talk() {
System.out.println("。。。说英文。。。");
}
}
package strategy;
/**
* 说中文
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/11 09 30
*/
public class SpeakChinese implements SpeakBehavior{
@Override
public void talk() {
System.out.println("。。。说中文。。。");
}
}
package strategy;
/**
* 工作行为
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/9 16 31
*/
public interface WorkBehavior {
void doSomeThing();
}
package strategy;
/**
* 翻译行为
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/11 09 34
*/
public class Translator implements WorkBehavior {
@Override
public void doSomeThing() {
System.out.println("。。。翻译员。。。");
}
}
package strategy;
/**
* 司机的行为
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/11 09 35
*/
public class Driver implements WorkBehavior {
@Override
public void doSomeThing() {
System.out.println("。。。司机。。。");
}
}
package strategy;
/**
* 抽象人
*
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/9 16 23
*/
public abstract class Person {
protected SpeakBehavior speakBehavior;
protected WorkBehavior workBehavior;
public void eat() {
System.out.println("。。。吃饭。。。");
}
public void think() {
System.out.println("。。。思考。。。");
}
public void sleep() {
System.out.println("。。。睡觉。。。");
}
public void speak(){
speakBehavior.talk();
}
public void work(){
workBehavior.doSomeThing();
}
public SpeakBehavior getSpeakBehavior() {
return speakBehavior;
}
public void setSpeakBehavior(SpeakBehavior speakBehavior) {
this.speakBehavior = speakBehavior;
}
public WorkBehavior getWorkBehavior() {
return workBehavior;
}
public void setWorkBehavior(WorkBehavior workBehavior) {
this.workBehavior = workBehavior;
}
}
package strategy;
/**
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/11 2:18 下午
*/
public class ZhangSan extends Person{
public ZhangSan(){
this.speakBehavior = new SpeakChinese();
this.workBehavior = new Driver();
}
}
package strategy;
/**
* @author ch
* @version 1.0.0
* @since 1.0.0
* <p>
* Created at 2019/12/11 2:38 下午
*/
public class Main {
public static void main(String[] args) {
ZhangSan zhangSan = new ZhangSan();
zhangSan.work();
zhangSan.speak();
System.out.println("努力学习英语~~~~");
zhangSan.setSpeakBehavior(new SpeakEnglish());
zhangSan.setWorkBehavior(new Translator());
zhangSan.work();
zhangSan.speak();
zhangSan.think();
zhangSan.eat();
}
}