设计模式—策略模式
1、定义
定义了算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
2、前置知识
了解策略模式需要知道以下设计原则:
- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起
- 针对接口编程,而不是针对实现编程。
- 多用组合,少用继承
前置知识到此结束。
3、前置场景介绍
场景:
1、主管让你实现一个实现美丽的女孩、性感的女孩、温柔的女孩…
此时你会你想想到先定义一个超类 girl ,分别实现子类美丽的、性感的、温柔的继承超类girl
此时完美实现功能。
2、此时如果主管让你实现一个美丽又大方的女孩、性感又小气的女孩…
此时你会不会在写一个子类美丽又大方实现超类girl ,功能此时也实现了。
如果来一个功能,你实现一个子类,你想想你的系统中会有多少子类。
此时你会想 美丽的、性感的、温柔的定义一个接口,大方、小气的定义一个接口 让子类实现这个接口就行了。
但是你有没有想过 这样也会增加很多接口,同时跟继承一个样子。子类自己去实现自己的行为。缺乏动态的去指定。
那么此时策略模式来到我们的身边了。
4、具体实现
解读:
- 把美丽的、性感的… 定义一个外观接口 ExteriorBehavior 定义一个dispaly() 方法
- 把大方的、小气的… 定义一个脾气接口TemperBehavior 定义一个say() 方法
- 定义一个超类Girl 里面有共有的属性 (利用组合) 两个变量 ExteriorBehavior exterior TemperBehavior temper 和两个讲述外观和脾气的方法 dispalyOneself()、sayOneself()
- 定义一个美丽的大方的子类利用组合把两个接口在new 子类的时候 实例化
代码实现:
外观接口 ExteriorBehavior
/**
* @Author: wjs
* @Description: 外观
* @Date:Create:in 2020/9/22 0:31
* @Modified By:
*/
public interface ExteriorBehavior {
void dispaly();
}
脾气接口TemperBehavior
/**
* @Author: wjs
* @Description: 脾气
* @Date:Create:in 2020/9/22 0:31
* @Modified By:
*/
public interface TemperBehavior {
void say();
}
超类Girl
/**
* @Author: wjs
* @Description:
* @Date:Create:in 2020/9/22 0:30
* @Modified By:
*/
public class Girl {
/**
* 外观
*/
public ExteriorBehavior exterior;
/**
* 脾气
*/
public TemperBehavior temper;
public void dispalyOneself() {
exterior.dispaly();
}
public void sayOneself() {
temper.say();
}
}
美丽的大方的子类
/**
* @Author: wjs
* @Description: 美丽又大方的
* @Date:Create:in 2020/9/22 0:41
* @Modified By:
*/
public class BeautifulAndGenerousGirl extends Girl{
public BeautifulAndGenerousGirl() {
exterior = new BeautifulBehavior();
temper = new GenerousTemperBehavior();
}
}
运行结果:
/**
* @Author: wjs
* @Description:
* @Date:Create:in 2020/9/22 0:44
* @Modified By:
*/
public class main {
public static void main(String[] args) {
Girl girl = new BeautifulAndGenerousGirl();
girl.dispalyOneself();
girl.sayOneself();
}
}
此时还可以动态的改变行为,把美丽大方的 ——> 性感大方的
我们只需要在超类Girl 提供一个可以改变这个接口实现的方法就行。
/**
* @Author: wjs
* @Description:
* @Date:Create:in 2020/9/22 0:30
* @Modified By:
*/
public class Girl {
/**
* 外观
*/
public ExteriorBehavior exterior;
/**
* 脾气
*/
public TemperBehavior temper;
public void dispalyOneself() {
exterior.dispaly();
}
public void sayOneself() {
temper.say();
}
public void setExterior(ExteriorBehavior exterior) {
this.exterior = exterior;
}
}
运行结果:
/**
* @Author: wjs
* @Description:
* @Date:Create:in 2020/9/22 0:44
* @Modified By:
*/
public class main {
public static void main(String[] args) {
Girl girl = new BeautifulAndGenerousGirl();
girl.setExterior(new SexyBehavior());
girl.dispalyOneself();
girl.sayOneself();
}
}
策略模式的介绍到此已经完事了,大家也可以自己想象这样是不是更好。
此文如有不正确的地方,望大家可以不吝赐教!