网站首页 > 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!
四. 总结
结合策略模式的定义,我们可以看出鸭子的行为类即为算法族,鸭子即为使用算法的客户。我们将鸭子的行为(可变行为)采用针对接口编程的方式独立出来封装,使行为和实体互相独立,从而我们可以动态地增加修改一些行为,不会影响到既有的行为类,也不会影响到使用行为类的实体。
猜你喜欢
- 2024-09-30 Java策略模式在动态数据验证中的应用
- 2024-09-30 《设计模式》之策略模式(策略设计模式详解)
- 2024-09-30 Spring 中策略模式的 2 个经典应用
- 2024-09-30 Java策略模式实现动态验证不同来源的数据
- 2024-09-30 策略模式介绍以及具体使用场景(策略模式的优点及适用环境)
- 2024-09-30 什么是策略模式(策略模式的意图是什么)
- 2024-09-30 设计模式系列—策略模式(策略模式实现)
- 2024-09-30 快速带你彻底弄懂23种设计模式-策略模式
- 2024-09-30 「java设计模式」(7)——策略模式(案例解析)
- 2024-09-30 使用 Java 的策略设计模式(在java中找一个应用策略模式的实例)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)