您的位置:首页 > 编程语言 > Java开发

【设计模式】策略模式 Strategy

2017-06-15 15:07 573 查看

策略模式

要素:
1:策略的接口

2:策略接口的具体实现

3:策略的执行者(拥有策略接口的依赖)

简单描述:

1: 将功能需求定义在接口中,接口的实现类作为真正运行程序的策略。

2: 定义一个策略的执行类,执行类中应包含上面接口的依赖。 该类的默认构造器中将接口的实现注入到该类的元素中。

3:在执行类中定义,接口的功能方法(一般名字相同),该方法直接调用接口的方法(实际执行的是构造执行类时注入的接口实现类的方法)

其他:

1:接口的实现类(策略)可以任意增加,而不用修改执行类

2:在接口方法发生变化时,执行类也需要进行修改

简单例子:

package StrategyPattern;

/**
* @Title: DataScource.java
* @Package StrategyPattern
* @Description: 接口-定义策略的动作
* @author SUNF
* @date 2017年6月15日  下午2:57:27
*
*/
public interface DataScource {

String getDBName();

String getUrl();
}

package StrategyPattern;

/**
* @Title: Mysql.java
* @Package StrategyPattern
* @Description: 数据源第一个策略Mysql
* @author SUNF
* @date 2017年6月15日  下午2:57:08
*
*/
public class Mysql implements DataScource{

@Override
public String getDBName() {
return "mysql";
}

@Override
public String getUrl() {
return "localhost:3306xxxxx";
}

}

package StrategyPattern;

/**
* @Title: Oracle.java
* @Package StrategyPattern
* @Description: 数据源第一个策略Oracle
* @author SUNF
* @date 2017年6月15日  下午2:57:20
*
*/
public class Oracle implements DataScource{

@Override
public String getDBName() {
return "Oracle";
}

@Override
public String getUrl() {
return "127.0.0.1:1521xxxxx";
}

}

package StrategyPattern;

/**
* @Title: Context.java
* @Package StrategyPattern
* @Description: 执行类(也就是策略的执行者)
* @author SUNF
* @date 2017年6月15日  下午2:59:00
*
*/
public class Context {
//数据源动作接口
private DataScource dataScource;

//此时注入数据源 的实例
public Context(DataScource dataScource){
this.dataScource = dataScource;
}

/**以下下是策略的执行动作**/
public String getDBName() {
return dataScource.getDBName();
}

public String getUrl() {
return dataScource.getUrl();
}
}

package StrategyPattern;

public class Test {

public static void main(String[] args) {
Context context = new Context(new Mysql());
System.out.println(context.getDBName());

Context context2 = new Context(new Oracle());
System.out.println(context2.getDBName());
System.out.println(context2.getUrl());

}

}

运行结果:

mysql
Oracle
127.0.0.1:1521xxxxx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息