设计模式之策略模式(代码片段)

独孤九戒 独孤九戒     2022-12-13     594

关键词:

设计模式之策略模式

    策略模式(Straregy Pattern)是一种比较简单的模式,也叫政策模式(Policy Pattern),定义如下:Define a family of algorithms, encapsulate each one, and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以相互装换)

策略模式通用类图


三个角色

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

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

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

通用源码

抽象策略角色

public interface Strategy 
	public void doSomething();

具体策略角色

public class ConcreteStrategy1 implements Strategy
	public void doSomething()
		System.out.println("具体策略1的运算法则");
	

public class ConcreteStrategy2 implements Strategy
	public void doSomething()
		System.out.println("具体策略2的运算法则");
	

封装角色

public class Context 
	private Strategy strategy=null;
	public Context(Strategy _strategy)
		this.strategy=_strategy;
	
	public void doAnything()
		this.strategy.doSomething();
	

客户端

public class Client 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		Strategy strategy=new ConcreteStrategy1();
		Context context=new Context(strategy);
		context.doAnything();
	


策略模式优点

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

2.避免使用多重条件判断,如果没有策略模式,要在多个策略算法之间切换,会使用多重条件语句,多重条件语句不易维护,而且出错概率大。使用策略模式后,可以由其它模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,避免了条件语句判断;

3.扩展性良好,系统中增加一个策略很容易。

策略模式缺点

1.策略数量增多,每个策略都是一个类,复用的可能性很小,类数量增多;

2.所有的策略类都需要对外暴露,上层模块必须知道有哪些策略,然后才能决定使用那一策略,违背迪米特法则,可以使用其它模式来修复,如工厂方法模式,代理模式或享原模式。

策略模式使用场景

1.多各类只有在算法或行为上稍有不同的场景;

2.算法需要自动切换的场景;

3.需要屏蔽算法规则的场景。

策略模式的注意事项

    如果一个系统中策略家族的具体策略数量超过4个,则需要考虑混合模式,解决策略膨胀和对外暴露问题,否则日后的系统维护会非常麻烦。

例子:孙刘联姻

妙计接口

public interface IStrategy 
	public void operate();

妙计

public class BackDoor implements IStrategy
	public void operate()
		System.out.println("求乔国老");
	

public class GivenGreenLight implements IStrategy
	public void operate()
		System.out.println("求吴国太");
	

public class BlockEnemy implements IStrategy
	public void operate()
		System.out.println("孙夫人断后");
	

锦囊

public class Context 
	private IStrategy strategy;
	public Context(IStrategy strategy)
		this.strategy=strategy;
	
	public void operate()
		this.strategy.operate();
	

赵云

public class zhaoyun 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		Context context;
		System.out.println("第一个");
		context=new Context(new BackDoor());
		context.operate();
		System.out.println("第二个");
		context=new Context(new GivenGreenLight());
		context.operate();
		System.out.println("第三个");
		context=new Context(new BlockEnemy());
		context.operate();
	




设计模式之策略模式(代码片段)

...例1.简要概述策略模式也叫作决策模式,属于行为型设计模式。策略模式定义了解决某一个问题的一个算法族,允许用户从该算法族中针对不同的场景选择一个算法解决该问题,同时可以方便的更换算法或者增加新的... 查看详情

设计模式之策略模式(代码片段)

  今天我们要介绍的设计模式叫做策略模式。策略模式其实就是把不同的策略(方法)封装在不同的类中。在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式(... 查看详情

设计模式之策略模式(行为型)(代码片段)

一、模式定义策略模式:定义一系列算法,然后将每一个算法封装起来,并将它们可以互相替换。也就是将一系列算法封装到一系列策略类里面。策略模式是一种对象行为型模式。策略模式符合“开闭原则“StrategyPattern:Defineafami... 查看详情

设计模式之策略模式(代码片段)

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用不同的算法,减少了各种算法类与使用算法类之间的耦合。1|策略模式定义策略模式是一种... 查看详情

设计模式之策略模式(代码片段)

概念一个类的行为或者算法可以在运行时更改。表现形式一个系统有很多个类,而区分它们的只是他们直接的行为,此时将这些算法封装成一个一个的类,从而任意的替换。关键:实现同一个接口。具体实现创建一个定义活动的... 查看详情

大话设计模式之策略模式(代码片段)

背景:商场促销期间,可能会出现8折、5折的促销活动,也可能出现满100减10、满200减30的促销活动,设计一个收银系统。策略模式:定义了算法家族,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。... 查看详情

行为型设计模式之策略模式(代码片段)

@TOC策略模式应用场景1、针对同一类型问题,有多种处理方式,每一种都能独立解决问题。2、算法需要自由切换的场景。3、需要屏蔽算法规则的场景。优缺点优点:1.可以在运行时切换对象内的算法。2.避免使用多重条件转移语... 查看详情

设计模式之策略模式浅谈以及简单例子(代码片段)

...sp;            设计模式之策略模式 策略模式定义了算法类,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 策略模式是对算法的包装,... 查看详情

接口抽象类应用之策略模式学习(代码片段)

接口应用之策略模式策略模式(StrategyPattern),定义了一系列算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于它的客户应用而独立变化。OO设计原则面向接口编程(面向抽象编程)封装变化多用组合,... 查看详情

设计模式之策略模式(代码片段)

首先看定义,策略模式:策略模式定义了一系列算法,并将每一个算法封装起来,且使它们可以互相替换,此模式让算法的变化独立于使用算法的客户端。我的理解就是,分装起来的算法要实现相互替换,则说明这些算法是具有... 查看详情

设计模式之策略模式(代码片段)

设计模式之策略模式1.意图根据GOF的定义:定义一系列的算法或操作,并把它们一个个封装起来,并且使它们可以互换替换。以达到算法与业务独立开发的目的。简单的说就是针对某个业务需求,抽象出解决问题的算法的一个个... 查看详情

javascript设计模式之策略模式(代码片段)

...一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。策略模式的实现并不复杂,关键是如何从策略模式的实现 查看详情

设计模式之策略模式(代码片段)

前言最近在读《HeadFirst设计模式》一书,为加强记忆及便于日后查阅,在博客将自己的学习过程进行记录。谨以本篇策略模式作为博客的开篇章,并在后续过程中不断丰富自己的博客内容,欢迎各位进行浏览。问题现有一游戏Sim... 查看详情

设计模式之策略模式(代码片段)

一.应用背景   在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。把一个类(A)中经常改变或者将来可能改变的部分提取出来... 查看详情

设计模式之策略模式c++实现(代码片段)

参考书籍《HeadFirst设计模式》设计模式和设计原则策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式采用的设计原则:1、找出应用中可能需... 查看详情

大话设计模式之策略模式读后感(代码片段)

策略模式:定义了算法家族,分别封装起来,让他们呢之间可以互相的替换,此模式让算法的变化不会影响到使用算法的客户。UML类图:解读:策略模式是定义一系列的算法,从概念上来讲,这些算法完成的工作都是一样的,只... 查看详情

设计模式之策略模式(代码片段)

概述在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。 在软件开发中也常... 查看详情

设计模式之策略模式(代码片段)

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义策略模式定义了一系列的算法,并将每一个算法封装起来,他们之间还可以相互替换,策略模式独立于使用它的... 查看详情