设计模式之禅学习笔记--策略模式

一、定义

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换(实现相同的接口)。


二、通用类图


策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握。

1:Context 封装角色

它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接封装可能存在的变化。

2:Strategy 抽象策略角色

策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。

3:ConcreteStrategy 具体策略角色

实现抽象策略中的操作,该类含有具体的算法。

三、通用代码

1:Strategy 抽象策略角色

public interface Strategy {

	//策略模式的运算法则
	public void doSomething();
}

2:ConcreteStrategy 具体策略角色

public class ConcreteStrategy1 implements Strategy {

	@Override
	public void doSomething() {
		System.out.println("ConcreteStrategy1");
	}

}

public class ConcreteStrategy2 implements Strategy {

	@Override
	public void doSomething() {
		System.out.println("ConcreteStrategy2");
	}

}


3:Context 封装对象

public class Context {
	//抽象策略
	private Strategy strategy = null;
	
	//构造函数设置具体策略
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	
	//封装后的策略方法
	public void doAnything() {
		this.strategy.doSomething();
	}
}


4:Client 场景类

public class Client {
	public static void main(String[] args) {
		//声明一个具体的策略
		Strategy strategy = new ConcreteStrategy1();
		//声明封装对象
		Context context = new Context(strategy);
		//执行封装后的方法
		context.doAnything();
	}
}

四、优缺点

1:算法可以自由切换。这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其惊醒封装,拨正对外提供“可自由切换”的策略。

2:避免使用多重条件判断。

3:拓展性良好。

4:策略类数量增多。每个策略都是一个类,复用的可能性很小,类数量增多。

5:所有的策略类都需要对外暴露。


五、注意点

1:策略模式的重点是封装角色,它借用了代理模式的思路。它与代理模式的区别是:策略模式的封装对象和被封装的策略类不是实现同一个接口。

2:如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值