前言
如果说,商场打折针对不同的时节,比如双十一、圣诞节、春节这些值得促销的好日子,进行不同程度的降价打折从而获得最大程度上的收益,如果有一群鸭子,只会游泳、嘎嘎叫,但是某一天某种类型的鸭子学会了飞,那群里面的鸭子并不会飞。这样的话还有修改以前的封装好的算法,然后添加飞翔的功能,这个时候,就得考虑一下设计原则。对扩展开放,对修改封闭。针对这种算法经常变化的情况,将这些算法封装起来,独立于不变的成分,保证增加新的算法的同时,对不变的地方不添加修改。下面采用 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>
小结
上面就是策略模式一个小小的应用,希望在后期有更多实践。
感谢您的宝贵时间···