今天学习了一下策略模式。下面是我个人对策略模式的一些理解,并且尽可能的简化了理解。
1.策略模式的简单定义:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。
2.策略模式的三个角色:
- 策略:策略是一个接口,可以定义若干个抽象方法。
- 具体策略:具体策略是实现策略接口的类,重写接口所定义的方法并且给出方法体的具体内容。
- 上下文:上下文是依赖策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所重写的策略接口中的方法。
3.策略模式的UML类图:
4.策略模式的一个简单例子:,
用两种方法输出英文字母表:
比如:一种策略的输出格式为:A,a,B,b.......Z,z
另一种策略的输出格式为:A,B,C....Z,a,b,....z
用java代码实现如下:
(1)策略:
public interface Strategy {//策略接口public abstract void string();}
(2)具体策略:
具体策略1:
public class StrategyOne implements Strategy{//具体策略1
public void string(){//重写策略接口所定义的抽象方法
for( char ch='A'; ch<='Z'; ch++){
System.out.printf("%c,%c,",ch,ch+32);
}
}
}
具体策略2:
public class StrategyTwo implements Strategy{//具体策略2
public void string(){//重写策略接口所定义的抽象方法
for( char ch='A'; ch<='Z'; ch++){
System.out.printf("%c,",ch);
}
for( char ch='a'; ch<='z'; ch++){
System.out.printf("%c,",ch);
}
}
}
(3)上下文:
public class Context {//上下文
Strategy strategy;// 策略声明的变量
public void setStrategy(Strategy strategy){
this.strategy = strategy;//设置具体是哪一个的策略
}
public void outString(){
strategy.string();//利用策略变量调用具体策略所重写的策略接口中的方法String()
}
}
(4)模式的使用:
public class Application {
public static void main(String args[]){
Context str = new Context();//声明上下文变量
str.setStrategy(new StrategyOne());//设置具体策略
str.outString();
System.out.println();
str.setStrategy(new StrategyTwo());
str.outString();
}
}
(5)程序运行结果:
A,a,B,b,C,c,D,d,E,e,F,f,G,g,H,h,I,i,J,j,K,k,L,l,M,m,N,n,O,o,P,p,Q,q,R,r,S,s,T,t,U,u,V,v,W,w,X,x,Y,y,Z,z,
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,
这是我自己经过理解后,用非常简单的一个例子来说明了一下策略模式的使用方法,希望对于大家学习有所帮助,有什么不妥还请指正!!!