设计模式 行为模式之策略模式

1 基础知识

1.1 标准定义

策略模式标准定义:定义一系列的算法,把它们一个个封装起来并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

1.2 分析和说明

策略(Strategy)模式属于对象的行为模式,通过分析Strategy模式可以发现:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得他们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

在软件设计中,经常会遇到因为一开始考虑不够长远而导致后面遇到很大的麻烦。开发者只是想尽快地解决问题而没考虑到后期的维护或者根本没法预料到将来会有什么样的变化干脆置之不理。针对这个问题,Strategy模式提供一个解决问题的方案:面向接口编程而不是实现,发现其中会改变的部分作为扩展点,然后把它封装起来。

Stragegy结构角色包括环境角色,抽象策略角色和具体策略角色。

环境(Context)角色:拥有一个Strategy接口的引用。环境(Context)角色可以是接口、具体类或抽象类。该角色不可缺少。

抽象策略(Strategy)角色:这是一个抽象角色,此角色给出所有的具体策略类所需的统一接口,或者是定义所有支持的算法的公共接口。通常由一个接口或抽象类实现。

具体策略(Concrete Strategy)角色:包装了相关的算法或行为。具体策略角色都是具体类来实现。以Strategy接口实现某具体算法。

当客户调用Context时,它将客户的请求转发给它的Strategy。Context将该算法所需的所有数据传递给Strategy,或者将自身作为参数传递给Strategy,使Strategy可以回调COntext,ConcreteStrategy实现具体算法。


2 应用场景举例

比如公司在多个行业中有项目,对于不同的行业,项目有不同的做法。行业项目就是环境角色。有一个抽象策略角色。而银行行业项目管理策略、能源行业项目管理策略,电信行业项目管理策略,政府项目管理策略全部都继承抽象策略并有各个行业的实现 模式。

可以把Project类理解为环境(Context)角色。Strategy抽象类是抽象策略角色。BankStrategy类是具体策略角色。其实现类图为:

客户需要调用project的策略活动时,将不同的Strategy传递给project,这些策略包括银行策略,政府策略。当调用project的具体策略的工作时,实际上由这些不同策略来完成工作。


3 Java程序实现代码

Java程序实现包括Project类文件,Strategy类文件等

public class Project {
private String projectName;
private Strategy strategy;

public Project(String projectName){
super();
this.projectName= projectName;
}

public Project(String projectName, Strategy strategy){
super();
this.projectName= projectName;
this.strategy = strategy;
}


public String getProjectName() {
return projectName;
}


public void setProjectName(String projectName) {
this.projectName = projectName;
}


public Strategy getStrategy() {
return strategy;
}


public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}

public void doCommonWork(){}
public void doStrategyEork(){
strategy.doWork(this);
}

}


public abstract class Strategy {
public void doWork(Project project){}
}


public class BankStrategy extends Strategy{
public void doWork(Project project){
System.out.println(project.getProjectName()+"采用银行策略的工作");
}
}


public class GovermentStrategy extends Strategy{
public void doWork(Project project){
System.out.println(project.getProjectName()+"采用政府策略的工作");
}
}


public class TelecomStrategy extends Strategy{
public void doWork(Project project){
System.out.println(project.getProjectName()+"采用电信策略的工作");
}
}


策略模式的测试代码为:

public class Client {
public static void main(String[] args){
System.out.println("--要求ProjectA采用银行策略---");
Project projectA = new Project("projectA");
Strategy strategy1= new BankStrategy();
projectA.setStrategy(strategy1);
projectA.doStrategyEork();

System.out.println("--要求ProjectA采用政府策略---");
Project projectB = new Project("projectA");
Strategy strategy2= new GovermentStrategy();
projectB.setStrategy(strategy2);
projectB.doStrategyEork();
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值