关于设计模式至今理解不是很深,在此发表文章一方面为了加深对设计模式的理解,另一方面希望由此与大家进行交流。
今天研究了一下策略模式,对策略模式理解为:通过对抽象策略角色(抽象类、接口)的实现的包装,从未进行动态操作的过程。
详细解释如下:
1.抽象策略角色:策略类,包含要做的事情(方法),通常有抽象类或接口进行实现;
2.策略类的实现:包装了对要做的事情的具体做法和行为;
3.动态操作:持有对策略类的引用,从而可以动态选择需要的实现,最终交给某一客户端进行调用。
对于策略模式来说,核心的部分是持有对策略类的引用。
具体代码示例如下:
1./**策略类*/
public interface
IStrategy {
/**
策略方法
*/
public abstract double
add();
}
2./**策略类的实现,以下写了两个实现*/
public class
ConcreteStrategy1
implements
IStrategy {
/**
示意性算法
*/
public double
add() {
//
TODO
自动生成方法存根
System.
out
.println(
this
.getClass().getName() +
"的加法运算"
);
return
0;
}
}
public class
ConcreteStrategy2
implements
IStrategy {
public double
add() {
//
TODO
自动生成方法存根
System.
out
.println(
this
.getClass().getName() +
"的加法运算"
);
return
0;
}
}
3./**对策略类的引用*/
public class
Context {
/**
环境角色类
*/
private
IStrategy
strategy
;
public
Context(IStrategy strategy) {
this
.
strategy
= strategy;
}
/**
策略方法
*/
public double
add() {
this
.
strategy
.add();
return
0;
}
}
4./**客户端调用*/
public class
Main {
/**
*
@param
args
*/
public static void
main(String[] args) {
//
TODO
自动生成方法存根
Context context =
new
Context(
new
ConcreteStrategy1());
context.add();
//执行算法1
context =
new
Context(
new
ConcreteStrategy2());
context.add();
//执行算法2
}
}
5.执行结果如下:
ConcreteStrategy1的加法运算
ConcreteStrategy2的加法运算
6.总结:
优点:可以动态的选择需要的实现;
缺点:需要自行去决定需要那些实现,即必须对每个实现类熟悉。