一:策略模式例子:
先附上代码:
IStrategy.java
package strategyPattern;
public interface IStrategy
{
public void operate();
}
BackDoor.java
package strategyPattern;
public class BackDoor implements IStrategy
{
public void operate() {
// TODO Auto-generated method stub
System.out.println("妙计1");
}
}
GivenGreenLight.java
package strategyPattern;
public class GivenGreenLight implements IStrategy
{
public void operate() {
// TODO Auto-generated method stub
System.out.println("妙计2");
}
}
BlockEnemy.java
package strategyPattern;
public class BlockEnemy implements IStrategy
{
public void operate() {
// TODO Auto-generated method stub
System.out.println("妙计3");
}
}
Context.java
package strategyPattern;
//封装类(即锦囊)
public class Context
{
private IStrategy strategy;
//构造函数:决定使用哪个妙计
public Context(IStrategy _strategy)
{
this.strategy = _strategy;
}
//使用计谋
public void operate()
{
this.strategy.operate();
}
}
ZhaoYun.java
package strategyPattern;
public class ZhaoYun
{
public static void main(String[] args)
{
Context context;
System.out.println("---使用第一个妙计---");
context = new Context(new BackDoor());
context.operate();
System.out.println("\n");
System.out.println("---使用第二个妙计---");
context = new Context(new GivenGreenLight());
context.operate();
System.out.println("\n");
System.out.println("---使用第三个妙计---");
context = new Context(new BlockEnemy());
context.operate();
System.out.println("\n");
}
}
二.策略模式定义:
策略模式使用的是面向对象中的继承和多态机制
三个角色如下:
1.Context封装角色:起封装作用,屏蔽高层模块对策略,算法的直接访问
2.Strategy抽象策略角色:通常为借口,定义每个策略或算法必须具有的属性和方法
3.ConcreteStrategy具体策略角色:实现抽象策略角色的操作
通用源码如下:
Strategy.java
package strategyPattern;
//抽象策略角色
public interface Strategy
{
public void doSomething();
}
ConcreteStrategy1.java
package strategyPattern;
//具体策略角色
public class ConcreteStrategy1 implements Strategy
{
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("策略1的具体实现");
}
}
ConcreteStrategy2.java
package strategyPattern;
//具体策略角色
public class ConcreteStrategy2 implements Strategy
{
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("策略1的具体实现");
}
}
Context.java
package strategyPattern;
//封装角色
public class Context
{
private Strategy strategy = null;
public Context(Strategy _strategy)
{
this.strategy = _strategy;
}
public void doAnything()
{
this.strategy.doSomething();
}
}
Client.java
package strategyPattern;
//高层模块
public class Client
{
public static void main(String[] args)
{
Strategy strategy = new ConcreteStrategy1();
Context context = new Context(strategy);
context.doAnything();
}
}