您的位置:首页 > 其它

[设计模式]策略模式

2015-01-01 22:56 197 查看
1. 定义

  它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响使用算法的客户。

2. 类图

  


  Strategy定义所有算法的公共接口

public interface Strategy {
public void algorithmInterface();
}


  具体算法实现,定义了三种算法,分别为ConcreteStrategyA、ConcreteStrategyB和ConcreteStrategyC

public class ConcreteStrategyA implements Strategy {
public void algorithmInterface() {
//算法A
}
}

public class ConcreteStrategyB implements Strategy {
public void algorithmInterface() {
//算法B
}
}

public class ConcreteStrategyC implements Strategy {
public void algorithmInterface() {
//算法C
}
}


  上下文包含一个Strategy具体策略对象

public class Context {
private Strategy strategy;

public Context(Strategy strategy) {
this.strategy = strategy;
}

public void contextInterface() {
this.strategy.algorithmInterface();
}
}


3.使用策略模式实现针对不同顾客报价小列子

package com.jerry.designpattern;
/**
*
* @author Jerry
* @date 2015年1月1日 下午10:44:31
*/
public interface Strategy {
double calcPrice(double price);
}

package com.jerry.designpattern;
/**
*
* @author Jerry
* @date 2015年1月1日 下午10:46:04
*/
public class NormalCustomerStrategy implements Strategy{

@Override
public double calcPrice(double price) {
// TODO Auto-generated method stub
System.out.println("对于新顾客或普通顾客,没有折扣");
return price;
}

}

package com.jerry.designpattern;
/**
*
* @author Jerry
* @date 2015年1月1日 下午10:49:00
*/
public class OldCustomerStrategy implements Strategy{

@Override
public double calcPrice(double price) {
// TODO Auto-generated method stub
System.out.println("对于老顾客,打5%折扣");
return price * (1 - 0.05);
}

}

package com.jerry.designpattern;
/**
*
* @author Jerry
* @date 2015年1月1日 下午10:50:27
*/
public class VipStrategy implements Strategy{

@Override
public double calcPrice(double price) {
// TODO Auto-generated method stub
System.out.println("对于VIP顾客,打10%折扣");
return price * (1 - 0.1);
}

}

package com.jerry.designpattern;
/**
*
* @author Jerry
* @date 2015年1月1日 下午10:51:22
*/
public class Context {
private Strategy strategy;

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

public double quote(double price) {
return this.strategy.calcPrice(price);
}
}

package com.jerry.designpattern;
/**
*
* @author Jerry
* @date 2015年1月1日 下午10:53:04
*/
public class Client {
public static void main(String[] args) {
Context context = new Context();
Strategy normal = new NormalCustomerStrategy();
context.setStrategy(normal);
System.out.println("报价为:" + context.quote(1000));

Strategy old = new OldCustomerStrategy();
context.setStrategy(old);
System.out.println("报价为:" + context.quote(1000));

Strategy vip = new VipStrategy();
context.setStrategy(vip);
System.out.println("报价为:" + context.quote(1000));
}
}


执行main方法,控制台输出如下,实现了不同算法间的切换

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