专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java设计模式-策略模式(java设计模式的六大原则)

temp10 2024-09-30 00:30:05 java教程 198 ℃ 0 评论

一. 定义

Java设计模式-策略模式(java设计模式的六大原则)

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

二. 设计原则

  • 针对接口编程,而不是针对实现编程。

  • 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

  • 多用组合少用继承。

三. 实例

实现拥有不同行为、特征的鸭子,并且可动态设置鸭子的行为。

1. 新建鸭子行为接口

  • 飞行行为接口

public interface FlyBehavior {void fly();}

  • 叫行为接口

public interface QuickBehavior {void quack();}

2. 鸭子行为实现类

  • 不会飞

public class FlyNoWay implements FlyBehavior {

public void fly() {

System.out.println("I can not fly!!");

}

}

  • 会飞

public class FlyWithWings implements FlyBehavior {

public void fly() {

System.out.println("I'm flying!!");

}

}

  • 火箭助力飞行

public class FlyRocketPowered implements FlyBehavior {

public void fly() {

System.out.println("I'm flying with a rocket!");

}

}

3. 鸭子叫实现类

  • 呱呱叫

public class MuteQuack implements QuickBehavior {

public void quack() {

System.out.println("<< Silence >>");

}

}

  • 吱吱叫

public class Squeak implements QuickBehavior {

public void quack() {

System.out.println("Squeak");

}

}

4. 鸭子抽象类

public abstract class Duck {

QuickBehavior quickBehavior;

FlyBehavior flyBehavior;

public void performQuack(){

quickBehavior.quack();

}

public void performFly(){

flyBehavior.fly();

} //动态设置鸭子的行为

public void setQuickBehavior(QuickBehavior quickBehavior) {

this.quickBehavior = quickBehavior;

}

public void setFlyBehavior(FlyBehavior flyBehavior) {

this.flyBehavior = flyBehavior;

}

}

5. 鸭子实体类

  • 绿头鸭

public class MallardDuck extends Duck {

public MallardDuck(){

quickBehavior = new Squeak();

flyBehavior = new FlyWithWings();//会飞

}

public void display(){

System.out.println("I'm a real Mallard duck");

}

}

  • 模型鸭

public class ModelDuck extends Duck {

public ModelDuck() {

flyBehavior = new FlyNoWay();//不会飞

quickBehavior = new Squeak();

}

public void disPlay(){

System.out.println("I'm a real Model Duck!");

}

}

6. 测试

public class MiniDuckSimulator {

public static void main(String[] args) {

Duck mallard = new MallardDuck();//新建绿头鸭

mallard.performFly();//飞行动作

mallard.performQuack();//叫动作

Duck modelDuck = new ModelDuck();//新建模型鸭

modelDuck.performFly();//飞行行为

modelDuck.setFlyBehavior(new FlyRocketPowered());//添加新行为

modelDuck.performFly();//飞行行为

}

}

7. 输出

I'm flying!!

Squeak

I can not fly!!

I'm flying with a rocket!

四. 总结

结合策略模式的定义,我们可以看出鸭子的行为类即为算法族,鸭子即为使用算法的客户。我们将鸭子的行为(可变行为)采用针对接口编程的方式独立出来封装,使行为和实体互相独立,从而我们可以动态地增加修改一些行为,不会影响到既有的行为类,也不会影响到使用行为类的实体。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表