设计模式(二)-策略(Strategy)模式
2017-04-06 09:07
204 查看
我们先来看看设计模式的开闭原则
开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统。
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
开闭原则的含义:一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码来实现变化。
注意:开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,低层模块的变更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段了。
变化的类型:逻辑变化、 子模块变化、可见试图变化一个项目的基本路径应该是这样的:项目开发、重构、测试、投产、运维,其中的重构可以对原有的设计和代码进行修改,运维尽量减少对原有代码修改,保持历史代码的纯洁性,提高系统的稳定性。
上面讲了很多理论,其实就是为下面的策略设计模式做一些铺垫,能扩展就不去修改。下面开始看个例子
![](http://img.blog.csdn.net/20170406082906042?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxkbm90YXBwZWFyY2FsbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面看看设计图一目了然
![](http://img.blog.csdn.net/20170406083117438?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxkbm90YXBwZWFyY2FsbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
遵循开闭原则的情况下扩展了弼马温职位。
下面我们再看策略设计模式的另一个例子
![](http://img.blog.csdn.net/20170406083444319?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxkbm90YXBwZWFyY2FsbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面我们看看代码实现,就很简单。
场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。
抽象策略类(Strategy)
三个实现类(ConcreteStrategy):
妙计一:初到吴国
BackDoor.java
妙计二:求吴国太开绿灯放行
GivenGreenLight.java
妙计三:孙夫人断后,挡住追兵
BlackEnemy.java
环境类(Context)
下面是主方法
三招下来,搞得的周郎是“赔了夫人又折兵”。
不同的时候选择使用不同的策略。
下面我们再看一个例子
![](http://img.blog.csdn.net/20170406085652994?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxkbm90YXBwZWFyY2FsbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20170406085731119?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxkbm90YXBwZWFyY2FsbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面是代码的实现。
Strategy.java
CooperateCustomerStrategy.java
LargeCustomerStrategy.java
NormalCustomerStrategy.java
OldCustomerStrategy.java
Price.java(相当于Context)
Client.java
解释在图中
![](http://img.blog.csdn.net/20170406090127356?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxkbm90YXBwZWFyY2FsbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面看看每个类的解释
![](http://img.blog.csdn.net/20170406090252936?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxkbm90YXBwZWFyY2FsbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图中都解释的很清楚,不懂得留言大家讨论
开闭原则(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); } }
解释在图中
下面看看每个类的解释
图中都解释的很清楚,不懂得留言大家讨论
相关文章推荐
- 设计模式随笔系列:鸭子-策略模式(Strategy)[原]
- 设计模式(18)-策略模式(Strategy)
- 设计模式之Strategy(策略)
- 设计模式解析(第二版)笔记4 Strategy 策略模式
- 设计模式(三)[策略(Strategy)模式]
- 设计模式之Strategy(策略)
- 学习设计模式之旅 / 策略模式 (Strategy) 推荐
- 设计模式学习1——策略模式(Strategy)
- Java设计模式-----Strategy策略模式
- 设计模式之策略模式(Strategy)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式与泡mm的关系之strategy策略模式及再思考
- 设计模式随笔系列:鸭子-策略模式(Strategy)
- 设计模式之Strategy(策略)
- 设计模式之策略模式(strategy)--游戏角色使用武器
- Head First 设计模式 C++实现-Strategy(策略模式)
- Head First 设计模式 C++实现-Strategy(策略模式)
- 设计模式(20)-策略模式(Strategy)