java 策略模式 例子-鸭子用不同策略即可策略模式鸭子问题解决
概念:
设计模式是人们在对面同类型软件工程 设计问题所总结出的一些有用经验。模式不是代码,而是某类问题的通用设计解决方案。
策略,指计策;谋略。一般是指:1. 可以实现目标的方案集合;2. 根据形势发展而制定的行动方针和斗争方法
策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则:分离变化部分,封装接口,基于接口编程各种功能。
问题引入
Head First里面的例子java 策略模式 例子,一段程序要实现不同的鸭子叫和鸭子飞.
Duck类:
package com.duck.mark;
public abstract class Duck {
int aga;
abstract public void fly();
abstract public void quack();
}
绿鸭子
package com.duck.mark;
public class BlueDuck extends Duck{
@Override
public void fly() {
System.out.println("blue duck fly");
}
@Override
public void quack() {
System.out.println("blue duck quack");
}
}
红鸭子:
package com.duck.mark;
public class RedDuck extends Duck{
@Override
public void fly() {
System.out.println("red duck fly");
}
@Override
public void quack() {
System.out.println("red duck quack");
}
}
木头鸭子
package com.duck.mark;
public class WoodDuck {
//不会叫
//不会飞
}
当遇到引入的木头鸭子,不是动物时。这个鸭子不会叫,也不会飞,但是木头鸭子也属于鸭子的一种,所以应该继承Duck类,但是他确实现不了叫,飞的功能
所以我们把这些有变化的行为或者说方法封装成一组策略,不同的鸭子用不同策略即可
策略模式鸭子问题解决UML类图
代码
我们写一个工人去上班的程序去实现策略模式
去上班有很多交通工具可选
有关idea显示类图不显示属性和方法的问题,参考
一般的,策略模式主要分为以下三个角色:
1. 环境角色(Context):持有一个策略类引用 (本例中的 Worker类里面有一个goBehavior引用)
2. 抽象策略(Strategy):定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。一般的,我们使用接口或抽象类实现。 (GoBehavior 接口)
3. 具体策略(ConcreteStrategy):实现抽象策略类中的相关的算法或操作。(GoBehaviorByFoot ,GoBehaviorByCar ,GoBehaviorByBus )
package com.worker.mark;
public class Worker {
int age;
GoBehavior goBehavior;
//为了灵活选择策略
public void setGoBehavior(GoBehavior goBehavior) {
this.goBehavior = goBehavior;
}
public void go(){
goBehavior.go();
}
public static void main(String[] args) {
Worker worker1=new HaveCarWorker();
worker1.go();
Worker worker2=new NoCarWorker();
worker2.go();
Worker worker3=new NoCarWorker();
worker3.setGoBehavior(new GoBehaviorByFoot());
worker3.go();
}
}
package com.worker.mark;
public class HaveCarWorker extends Worker{
public HaveCarWorker(){
goBehavior=new GoBehaviorByCar();
}
}
package com.worker.mark;
public class NoCarWorker extends Worker{
public NoCarWorker(){
goBehavior=new GoBehaviorByBus();
}
}
package com.worker.mark;
public interface GoBehavior {
public void go();
}
package com.worker.mark;
public class GoBehaviorByFoot implements GoBehavior{
@Override
public void go() {
System.out.println("go by foot");
}
}
package com.worker.mark;
public class GoBehaviorByBus implements GoBehavior {
@Override
public void go() {
System.out.println("go by bus");
}
}
package com.worker.mark;
public class GoBehaviorByCar implements GoBehavior {
@Override
public void go() {
System.out.println("go by car");
}
}
运行结果:
适用场景 代码级别
当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的策略类中,可以在使用这些行为的类中消除条件语句
业务级别
策略模式就是用来封装策略的,但在实践中,我们发现可以用它来封装几乎任何类型的规则java 策略模式 例子,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性
总结:
策略模式是一种定义一系列策略的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合
不明白耦合的概念 参见此文章
策略模式的策略类层次为GoBehavior定义了一系列的可供重用的算法或行为。继承有助于吸取出这些算法中公用功能
在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的策略对象
注:如果文章有任何错误或不足,请各位大佬尽情指出,评论留言留下您宝贵的建议!如果这篇文章对你有些许帮助,希望可爱亲切的您点个赞推荐一手,非常感谢啦