设计模式之策略模式

参考书籍:《Head First设计模式》、《大话设计模式》

策略模式

什么是策略模式?

它定义了算法族,分别封装起来,让它们之间可以互相替换,而且使它们还可以相互替换。策略模式让算法的变化独立于使用算法的客户。

 
角色含义
Context
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
Strategy
 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy实现了Strategy定义的接口,提供具体的算法实现。

组成角色

Strategy(抽象策略角色): 策略类,通常由一个接口或者抽象类实现。

ConcreteStrategy(具体策略角色):包装了相关的算法和行为。

Context(环境角色):持有一个策略类的引用,最终给客户端调用。

 

策略模式有什么优点?

优点:

1,算法完成的是同一个工作,只是实现不同,可以用相同的调用方式来实现不同的算法,减少了各种算法类和使用算法类之间的耦合。

2,Strategy为Context定义了可重用的算法、行为,继承有助于提取出公用的功能

3,易于扩展,增加一个新的策略可以不改变原有代码

3,简化了单元测试,每个算法类,可以通过自己的接口来单独测试

策略模式的类结构

 

适用场景

对于有相似行为的类,在运行时动态选择具体执行的行为

对调用者隐藏具体策略的实现细节

体现的设计原则

1,封装原则

2,面向接口编程

       面向接口中的接口不是指全用interface来编程(这个接口指的是抽象类和接口),真正的意思是指面向supertype编程,关键是多态,能在运行时动态绑定子类类型,而不是绑死supertype类上,比如,Dog d=new Dog();

d.shout();

应该写成

Animal a=new Dog();

a.shout();

这样,我们就可以在运行时绑定类型

3,多用组合,少用继承

实例说明

Strategy

package com.company.designPattern.strategy;

public interface Strategy {
		public void strategy();
}


两个ConcreteStrategy

package com.company.designPattern.strategy;

public class ConcreteStrategyA implements Strategy{

	@Override
	public void strategy() {
			System.out.println("面对暴躁的男老板,执行A策略!");
	}

}


 

package com.company.designPattern.strategy;

public class ConcreteStrategyB implements Strategy {

	@Override
	public void strategy() {
			System.out.println("面对暴露的女老板, 执行B策略!");
	}

}


Context

package com.company.designPattern.strategy;

public class Context {
	   private Strategy strategy;
	   public Context(Strategy strategy){
		   this.strategy=strategy;
	   }
	   public void executeStrategy(){
		   strategy.strategy();
	   }
}


测试类

package com.company.designPattern.strategy;

public class Test {
	public static void main(String[] args) {
		Context context=new Context(new ConcreteStrategyA());
		context.executeStrategy();
		context=new Context(new ConcreteStrategyB());
		context.executeStrategy();
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值