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

设计模式(二)-策略(Strategy)模式

2017-04-06 09:07 204 查看
我们先来看看设计模式的开闭原则

开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统。

定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭

开闭原则的含义:一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码来实现变化。

注意:开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,低层模块的变更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段了。

变化的类型:逻辑变化、 子模块变化、可见试图变化一个项目的基本路径应该是这样的:项目开发、重构、测试、投产、运维,其中的重构可以对原有的设计和代码进行修改,运维尽量减少对原有代码修改,保持历史代码的纯洁性,提高系统的稳定性。

上面讲了很多理论,其实就是为下面的策略设计模式做一些铺垫,能扩展就不去修改。下面开始看个例子



下面看看设计图一目了然



遵循开闭原则的情况下扩展了弼马温职位。

下面我们再看策略设计模式的另一个例子



下面我们看看代码实现,就很简单。

场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。

抽象策略类(Strategy)

public interface Strategy {
public void operate();
}


三个实现类(ConcreteStrategy):

妙计一:初到吴国

BackDoor.java

public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");
}
}


妙计二:求吴国太开绿灯放行

GivenGreenLight.java

public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行");
}
}


妙计三:孙夫人断后,挡住追兵

BlackEnemy.java

public class BlackEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}


环境类(Context)

public class Context {
private Strategy strategy;
//构造函数,要你使用哪个妙计
public Context(Strategy strategy){
this.strategy = strategy;
}
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}


下面是主方法

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.setStrategy(new GivenGreenLight());
context.operate();
System.out.println("\n");

System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");
context.setStrategy(new BlackEnemy());
context.operate();
System.out.println("\n");
}
}


三招下来,搞得的周郎是“赔了夫人又折兵”。

不同的时候选择使用不同的策略。

下面我们再看一个例子





下面是代码的实现。

Strategy.java

/**
* 策略,定义计算报价算法的接口
*/
public interface Strategy {
/**
* 计算应报的价格
* @param goodsPrice 商品销售原价
* @return 计算出来的,应该给客户报的价格
*/
public double calcPrice(double goodsPrice);
}


CooperateCustomerStrategy.java

/**
* 具体算法实现,为战略合作客户客户计算应报的价格
*/
public class CooperateCustomerStrategy implements Strategy{
public double calcPrice(double goodsPrice) {
System.out.println("对于战略合作客户,统一8折");
return goodsPrice*0.8;
}
}


LargeCustomerStrategy.java

/**
* 具体算法实现,为大客户计算应报的价格
*/
public class LargeCustomerStrategy implements Strategy{
public double calcPrice(double goodsPrice) {
System.out.println("对于大客户,统一折扣10%");
return goodsPrice*(1-0.1);
}
}


NormalCustomerStrategy.java

/**
* 具体算法实现,为新客户或者是普通客户计算应报的价格
*/
public class NormalCustomerStrategy implements Strategy{
public double calcPrice(double goodsPrice) {
System.out.println("对于新客户或者是普通客户,没有折扣");
return goodsPrice;
}
}


OldCustomerStrategy.java

/**
* 具体算法实现,为老客户计算应报的价格
*/
public class OldCustomerStrategy implements Strategy{
public double calcPrice(double goodsPrice) {
System.out.println("对于老客户,统一折扣5%");
return goodsPrice*(1-0.05);
}
}


Price.java(相当于Context)

/**
* 价格管理,主要完成计算向客户所报价格的功能
*/
public class Price {
/**
* 持有一个具体的策略对象
*/
private Strategy strategy = null;
/**
* 构造方法,传入一个具体的策略对象
* @param aStrategy 具体的策略对象
*/
public Price(Strategy aStrategy){
this.strategy = aStrategy;  }
/**
* 报价,计算对客户的报价
* @param goodsPrice 商品销售原价
* @return 计算出来的,应该给客户报的价格
*/
public double quote(double goodsPrice){
return this.strategy.calcPrice(goodsPrice);
}}


Client.java

public class Client {
public static void main(String[] args) {
//1:选择并创建需要使用的策略对象
Strategy strategy = new OldCustomerStrategy();
//2:创建上下文
Price ctx = new Price(strategy);
//3:计算报价
double quote = ctx.quote(1000);
System.out.println("向客户报价:"+quote);
}
}


解释在图中



下面看看每个类的解释



图中都解释的很清楚,不懂得留言大家讨论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 设计模式