【Java】Strategy Pattern
前言
如果说,商场打折针对不同的时节,比如双十一、圣诞节、春节这些值得促销的好日子,进行不同程度的降价打折从而获得最大程度上的收益,如果有一群鸭子,只会游泳、嘎嘎叫,但是某一天某种类型的鸭子学会了飞,那群里面的鸭子并不会飞。这样的话还有修改以前的封装好的算法,然后添加飞翔的功能,这个时候,就得考虑一下设计原则。对扩展开放,对修改封闭。针对这种算法经常变化的情况,将这些算法封装起来,独立于不变的成分,保证增加新的算法的同时,对不变的地方不添加修改。下面采用 Strategy Pattern 进行实现。分别从UML图分析和代码两个方面进行分析。
内容
精华:
定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于使用算法的客户。
原则:
·将变化的地方封装起来了(封装变化)。
·多用组合,少用继承。
·针对接口编程,不针对实现。
UML图
DEMO部分:
说明:以下的代码为左半部分抽象类与子类继承抽象类,从而子类继承抽象类的属性和行为,其中的setFlyBehavior和setQuackBehavior方法作用可以在客户端调用该对象的时候动态添加鸭子的行为。
<span style="font-family:KaiTi_GB2312;font-size:18px;">package Duck; /* * author:zhoulitong */ abstract class Duck{ FlyBehavior flyBehavior; QuackBehavior quackBehavior; //表演一个叫的动作 public void performQuack(){ quackBehavior.quack(); } //表演一个飞的动作 public void performFly(){ flyBehavior.fly(); } public abstract void display(); //有了这个方法可以动态改变鸭子的行为了 public void setFlyBehavior(FlyBehavior fb){ flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior = qb; } } class MallardDuck extends Duck{ public MallardDuck(){ quackBehavior = new Quack();//实例化叫的实例 flyBehavior = new FlyWithWings();//实例化飞的实例 } public void display(){ System.out.println("小鸭是一个真正的鸭子!不是白天鹅"); } }</span>
说明:接口部分,这部分的代码是封装了变化的部分,从而让变化的部分独立于不变的部分,让这个设计模式更加的符合开闭原则,在这里,接口部分盛放的是鸭子的功能,鸭子表现行为的时候,分别利用多态进行按需求实例化自己想要的那部分功能行为。
<span style="font-family:KaiTi_GB2312;font-size:18px;">/* * author:zhoulitong */ //声明一个公共接口(类似于抽象类的功能) interface QuackBehavior { void quack();//声明一个呱呱叫的方法 } class Quack implements QuackBehavior{ public void quack(){ //实现鸭子呱呱叫 } } class Squeak implements QuackBehavior{ public void quack(){ //实现橡皮鸭吱吱叫的方法 } } class MuteQuack implements QuackBehavior{ public void quack(){ //什么都不做,不会叫 } } interface FlyBehavior{ void fly();//声明一个飞的接口方法 } class FlyWithWings implements FlyBehavior{ public void fly(){ //实现鸭子的飞行动作 } } class FlyNoWay implements FlyBehavior{ public void fly(){ //什么都不做,不会飞 } } class FlyRocketPowered implements FlyBehavior{ public void fly(){ } }</span>说明:客户端代码部分,申请一个对象的实例,采用了多态机制,实例化了一个实际存在的鸭子对象,分别执行行为。
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class MiniDuckSimulator{ public static void main (String[] args){ Duck mallard = new MallardDuck();//实例化一个鸭子 mallard.performFly();//飞的动作 mallard.performQuack();//叫的动作 //如果又增加了一个动作,可以通过Duck父类中的set方法对实例化的对象进行附加 //在运行时想要改变鸭子的行为,只需要调用鸭子的setter方法就可以了。 mallard.setFlyBehavior(new FlyRocketPowered()); mallard.performFly(); } }</span>
小结
上面就是策略模式一个小小的应用,希望在后期有更多实践。
感谢您的宝贵时间···