【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>

小结

  上面就是策略模式一个小小的应用,希望在后期有更多实践。


感谢您的宝贵时间···



原文地址:https://www.cnblogs.com/zhoulitong/p/6412333.html