策略模式

一、介绍
策略模式,Strategy Pattern,定义了一系列封装的算法族,他们之间可以相互替换,此模式使得算法的变化独立于使用算法的客户端。
主要体现了以下几个设计原则:
1)把变化的代码从不变的代码中分离出来;
2)针对接口编程,定义了策略接口;
3)多用组合或聚合,客户端通过组合的方式使用策略。

类图设计如下:
在这里插入图片描述
二、实现
类图:
在这里插入图片描述
1)策略接口

/**
 * @Note {飞行行为接口}
 * @author giserDev
 * @Date 2020-06-20 18:05:53
 */
public interface FlyBehavior {
	void fly(); // 子类具体实现
}
package com.giser.designpattern.streategy;

/**
 * @Note {叫声行为接口}
 * @author giserDev
 * @Date 2020-06-20 18:05:33
 */
public interface QuackBehavior {
	void quack();
}

2)Context类

package com.giser.designpattern.streategy;

public abstract class Duck {

	/**
	 * 组合相关的策略接口
	 */
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public Duck() {
	}

	public abstract void display();//显示鸭子信息
	
	public void quack() {
		if (quackBehavior != null) {
			quackBehavior.quack();
		}
	}

	public void fly() {
		if(flyBehavior != null) {
			flyBehavior.fly();
		}
	}

	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}
	
	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
	
}

3)策略实现类

package com.giser.designpattern.streategy;

public class GoodFlyBehavior implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println(" 飞翔技术高超 ~~~");
	}

}
package com.giser.designpattern.streategy;

public class NoFlyBehavior implements FlyBehavior{

	@Override
	public void fly() {
		System.out.println(" 不会飞翔  ");
	}

}
package com.giser.designpattern.streategy;

public class BadFlyBehavior implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println(" 飞翔技术一般 ");
	}

}

4)客户端

package com.giser.designpattern.streategy;

/**
 * @Note {测试客户端}
 * @author giserDev
 * @Date 2020-06-20 18:08:23
 */
public class Client {

	public static void main(String[] args) {
		PekingDuck pekingDuck = new PekingDuck();
		pekingDuck.fly();
		
		//动态改变某个对象的行为, 北京鸭 不能飞
		pekingDuck.setFlyBehavior(new NoFlyBehavior());
		System.out.println("北京鸭的实际飞翔能力");
		pekingDuck.fly();
	}

}

三、说明
1)策略模式的关键在于确定变化部分和不变部分;
2)策略模式的核心思想是尽量使用组合或聚合;
3)策略模式体现了“对修改关闭,对扩展开放”的原则,客户端增加行为时,只需要添加一种策略即可,避免了使用多重条件语句,如if-else if-else结构;
4)提供了可以替换继承的方法:策略模式将算法封装在独立的策略类中,使得客户端可以独立于Context进行算法切换,易于扩展;
5)注意: 每添加一个策略,就需要增加一个类,当策略过多时,会导致类过多。
6)在JDK中,Arrays类的比较算法Comparator使用了策略模式。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值