Java设计模式研究之策略模式

来源:互联网 发布:2017pta编程题答案 编辑:程序博客网 时间:2024/04/26 16:06

note:从今天开始每天研究一个设计模式《big bug , oh no!》

(一)策略模式(Strategy)

1.什么是策略模式:    

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(copy)

2.策略模式的设计原则:

        设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。  
      策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。(copy)

(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

3.策略模式的优点:

          策略模式的好处在于你可以动态的改变对象的行为。

4.策略模式经典例子:

策略模式经典的例子就是诸葛亮给赵云三个锦囊的案例,下面是代码:

(1)定义策略接口

package com.ly.moshitest.strategy;/** *  * @author ly *定义策略接口,其实你会发现和状态模式是一样样,区别咱后边看吧 */public interface Istrategy {//定义接口操作public void operate();}
(2)实现3个妙计

a.老刘想娶别个妹子,咱的弄点舆论,骗骗乔老爷子

package com.ly.moshitest.strategy;public class MakeYuLun implements Istrategy {@Overridepublic void operate() {// TODO Auto-generated method stubSystem.out.println("到吴地后派人到处宣扬孙权妹妹与刘备即将结婚的消息" +"(特别要告诉乔国老,他是周瑜的岳父,通过他告诉孙权的妈妈)");}}

b.制造个假消息,骗刘备早点回家,害怕他娶了媳妇,忘了蜀啊

package com.ly.moshitest.strategy;public class MakeMessage implements Istrategy {@Overridepublic void operate() {// TODO Auto-generated method stubSystem.out.println("制造假消息“刘备曹操要来打荆州”,催刘备回去");}}

c.孙夫人断后,挡住追兵
package com.ly.moshitest.strategy;public class FindHelp implements Istrategy {@Overridepublic void operate() {// TODO Auto-generated method stubSystem.out.println("找孙夫人求救,挡住追兵!");}}
(3)三个妙计都有了,那我们得找锦囊来放这三个妙计了吧

package com.ly.moshitest.strategy;/** *  * @author ly *我们都是诸葛亮,我们都得会制造锦囊啊 */public class Context {private Istrategy istrategy;public Context(Istrategy istrategy){this.istrategy = istrategy;}public void operate(){this.istrategy.operate();}}

(4)咱们把妙计和锦囊都装备好了,就给赵云去执行吧

package com.ly.moshitest.strategy;public class ZhaoYun {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub//来三个锦囊Context context1 = new Context(new MakeMessage());Context context2 = new Context(new MakeYuLun());Context context3 = new Context(new FindHelp());System.out.println("老刘想娶人家妹子,怎么办啊?");//不急,咱不是有军师锦囊嘛,打开第一个context1.operate();System.out.println("\n\n");System.out.println("周郎和孙权设计要留住刘备,怎么办呢?");//不急,军师锦囊,打开第二个context2.operate();System.out.println("\n\n");System.out.println("孙权反悔了,派兵追拿刘备!,怎么办啊!!!");//快,军师锦囊,打开第三个context3.operate();System.out.println("\n\n");}}
就这样,刘备就娶到了漂亮嫩媳妇。策略模式的特点主要体现在,策略类,我们可以继续根据不同的需求,继续增加,我们在使用的时候,只需要使用Context这个中间件就行了,这样软件开发中的要求,高内聚低耦合,完全体现出来了。(其实个人理解所谓的高内聚低耦合,就降低多个类与类之间的联系,代码量比较大的时候,这真的是个麻烦的事,我们就可以采用使用 中间齿轮的方式,连接类与类之间,这样 问题就简单多了嘛)。

4.策略模式和状态模式的区别:其实这个挺简单的,状态类嘛,咱们的设置个状态呗,然后去做判断呗,策略模式完全不会设置状态的嘛

 

 

 

0 0
原创粉丝点击