一、策略模式
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
二、举例
设计一个鸭子类,要求如下
- 飞,这种行为有多种变化
- 叫,这种行为有多种变化
- 展示,展示这只鸭子的种类
- 游泳行为,所有的鸭子都应该会游泳
分析:由于鸭子的飞、叫这种行为具有变化性,所以我们应该将变化独立封装起来,因此我们可以单独定义两个行为接口类,一个飞行为接口类,叫行为接口类,同时使用与之对应的不同的行为子类去实现,这样的一种设计模式就是策略模式。接下来看代码
鸭子类
package com.jackeys.StrategyMode;
/**
* @Description: 鸭子类
* @ClassName: Duck
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 9:55
* @Version: 1.0
*/
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(){}
public abstract void display();
public void swim(){
System.out.println("所有的鸭子都会游泳");
}
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
}
飞行为接口类
package com.jackeys.StrategyMode;
/**
* @Description: 飞行行为接口
* @ClassName: FlyBehavior
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 9:57
* @Version: 1.0
*/
public interface FlyBehavior {
void fly();
}
不会飞的行为实现类
package com.jackeys.StrategyMode;
/**
* @Description: 不会飞的行为实现类
* @ClassName: FlyNoWay
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 9:59
* @Version: 1.0
*/
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("我不会飞");
}
}
会飞的行为实现类
package com.jackeys.StrategyMode;
/**
* @Description: 飞的行为实现类
* @ClassName: FlyWithWings
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 9:58
* @Version: 1.0
*/
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("我会飞");
}
}
叫行为接口类
package com.jackeys.StrategyMode;
/**
* @Description: 叫声接口
* @ClassName: QuackBehavior
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 10:00
* @Version: 1.0
*/
public interface QuackBehavior {
void quack();
}
呱呱叫行为接口实现类
package com.jackeys.StrategyMode;
/**
* @Description: 呱呱叫行为的实现类
* @ClassName: Quack
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 10:01
* @Version: 1.0
*/
public class Quack implements QuackBehavior{
@Override
public void quack() {
System.out.println("呱呱呱");
}
}
吱吱叫行为接口实现类
package com.jackeys.StrategyMode;
/**
* @Description: 吱吱交行为实现类
* @ClassName: Squeak
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 10:04
* @Version: 1.0
*/
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println("吱吱吱");
}
}
不会叫行为接口实现类
package com.jackeys.StrategyMode;
/**
* @Description: 不会叫行为的实现类
* @ClassName: MuteQuack
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 10:02
* @Version: 1.0
*/
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {
System.out.println("沉默中......");
}
}
测试
package com.jackeys.StrategyMode;
/**
* @Description: 测试
* @ClassName: Test
* @Package com.jackeys.StrategyMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/4 10:10
* @Version: 1.0
*/
public class Test {
public static void main(String[] args) {
Duck duck=new MallardDuck();
duck.performFly();//我会飞
duck.performQuack();//呱呱呱
duck.display();//我是一只绿头鸭
}
}