策略模式
下面的所有知识点来自《Head First 设计模式》,相关理论经过本人理解转义,请知悉
如需要原始理论,请自行百度相关书籍
什么是策略模式
策略模式就是将一个类中不变的部分和变化的部分分离成两个类
让我们用
一个鸭子项目来深入理解这种模式
Duck.class是鸭子的超类
//请注意这个类是一个抽象类
public abstract class Duck{
//鸭子都会呱呱叫
void quack(){
.......
}
//鸭子都能游泳
void swim(){
.......
}
//鸭子都有自己的外观
abstract void display();
}
如果现在有两个不同外观的鸭子 MallardDuck
和 RedheadDuck
,继承 Duck类,实现display()方法
class MallardDuck extend Duck{
void display(){
//外观是绿头
......
}
}
class RedheadDuck extend Duck{
void display(){
//外观是红头
......
}
}
目前如果需要添加鸭子,继承Duck类即可
公司现在要让鸭子飞起来
这时候,如果你在Duck中直接实现fly()
方法,你认为功能很完善,收拾东西回家过年了
//请注意这个类是一个抽象类
public abstract class Duck{
//鸭子都会呱呱叫
void quack(){
.......
}
//鸭子都能游泳
void swim(){
.......
}
//让鸭子都飞起来
void fly(){
....
}
//鸭子都有自己的外观
abstract void display();
}
同时,你大意的同事,在系统中加入了新的不会叫橡皮鸭子(RubberDuck
),却也和你一样着急回家过年
class RubberDuck extend Duck{
void display(){
//外观是黄色
......
}
}
这样,年后系统中多了一只能飞的橡皮鸭子,而你和你大意的同事,大概要开始刷力扣了
为了解决这个问题,你把Duck中fly()方法改为了抽象方法,这时,公司买了一只木头鸭子,你举一反三地把quack()也改成了抽象方法。
到目前为止,你解决你当前遇到的所有问题,可是你的上司是一个喜欢定期更新一大批鸭子品类的变态。
每加入一个品类的鸭子,你就需要维护相应的quack()、fly()、display()方法
为了实现你主管龌龊的计划,你必须想出其他的方法,来解决这个问题
策略模式帮助你解决了这个问题
把鸭子类中变化的部分(quack、fly )抽离出来作为单独的超类(quackimpl,flyimpl),使用子类实现quackimpl接口的方法,如下图所示
同时:在Duck中引用相关的行为类
问题的解决方案如下:
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
public interface FlyBehavior {
public void fly();
}
public interface QuackBehavior {
public void quack();
}
public class MallardDuck extends Duck {
public MallardDuck() {
//QUACK() 是quack的行为类
quackBehavior = new Quack();
//FlyWithWings 是fly的行为类
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}