我学设计模式 之 策略模式

来源:互联网 发布:网络与新媒体传播 编辑:程序博客网 时间:2024/05/16 15:56

我学设计模式之策略模式

1.       简介

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。策略模式可以使算法在不影响客户单独情况下发生变化。

 

 

2.       策略模式的结构

策略模式又称政策。以下是一个适应性的实现讲解策略模式的实例结构:

 

 

 

 

 

 

策略模式涉及到3个角色:

1.    环境角色:持有一个Strategy类的引用。

2.    抽象策略:这是一个抽象角色,通常有一个接口或抽象类实现。此角色给出所有的具体策略类的所有接口。

3.    具体策略:包装了相关的算法或行为。

 

3.       策略模式实现

上面UML转换成Java代码清单如下:

环境角色

package com.zsw.strategy;

 

/**

 * 环境角色

 * @author zsw

 */

public class Context {

    private Strategy strategy;

   

    public Context(Strategy strategy){

       this.strategy = strategy;

    }

   

    //策略方法

    public void strategyInterface(){

       this.strategy.strategyInterface();

    }

}

 

 

抽象策略代码清单:

package com.zsw.strategy;

/**

 * 抽象策略

 * @author Administrator

 */

public abstract class Strategy {

   

    //策略方法

    public abstract void strategyInterface();

}

 

 

具体策略代码清单:

package com.zsw.strategy;

/**

 * 具体策略A

 * @author zsw

 */

public class ConcreteStrategyA extends Strategy {

    @Override

    public void strategyInterface() {

       System.out.println("具体策略A");

    }

}

package com.zsw.strategy;

/**

 * 具体策略B

 * @author zsw

 */

public class ConcreteStrategyB extends Strategy {

    @Override

    public void strategyInterface() {

       System.out.println("具体策略B");

    }

}

 

 

 

 

      

4.       在什么样的情况下使用策略模式

1.如果一个系统里面有许多类,他们之间的差别仅在他们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。

2 一个系统需要动态的在几种算法中选择一种算法,可以采用策略模式。

   3.一个系统使用的算法数据不可以让客户端知道。

   4.如果一个对象有很多的行为,如果不用恰当的模式,这些行为只好使用多重条件语句来实现。

 

 

5.       策略模式的有优缺点

优点:

l         策略模式提供管理相关算法族的办法。

l         策略模式提供了可以替换继承关系的办法。

l         使用策略模式可以避免使用多重条件转移语句。

 

缺点:

l         客户端必须知道所有的策略类,并自行决定使用那一个策略类。

l         策略模式造成很多的策略类.

 

6.       策略模式应用场景

1)        Java语言中也用到了策略模式,例如在java.awt库和Swing库中看到 AWT中的LayoutManager

Java.awt类库需要在运行期间动态的有客户端决定一个Container对象怎样排序列它所有的GUI构件。Java语言提供了几种不同的排序方式,包装在不同的类中:

l         Borderlayout

l         FlowLayout

l         GridLayout

l         GridBagLayout

l         CardLayout

 

 

2)        Swing中的Border

在任何一个Swing构件上都可以画上边框(Border),而Swing提供了很多的边框类型,包括bevellinetitled以及CompoundBorder类等Swing构件的基类是JComponent类,而这个类负责为Swing构件画上边框。

       Jcomponent实现了paintBorder()方法,并且保持一个私有的对边框对象的引用。由于Border是一个接口,而不是一个具体的类,因此,这个引用可以指向任何实现了Border接口的边框对象。

 

 

3)        设计一个排序系统

如果要设计一个排序系统(Sortter System),动态的决定采用二元排序、冒泡排序、堆栈排序、快速排序、基数排序。

显然策略模式吧几种排序算法包装到不同的算法类里面,让所有的算法具有相同的接口,就是一个很好的设计。

 

4)        餐饮系统收银打折

此功能照样可以采用策略模式来设计,折扣可以根据以下的几种算法进行:

1.       对于没有折扣消费项目。折扣算法对象返回0作为折扣值。

2.       对于有些消费项目提供一个百分比的折扣。

3.       对于有些会员根据会员等级进行折扣。

4.       对于客户消费项目满多少,返回到少的值。例如:满30050等。

5.       ……

 

5)        一个公司的销售数据统计

策略模式是指对一项业务功能多种处理方式提供选择的使用,例如一个公司的销售数据可以根据其特点,选择折线、柱状图、饼图等进行处理,这些图形处理方式是策略,这些可以选择策略处理功能需求的方式就是策略。

 

6)        再举一个三国中的例子

当年赵云保护刘备入吴国迎娶孙权的妹妹,诸葛亮给了他3个锦囊,囊中有个3条妙计,嘱咐赵云伺机行事。这3个锦囊妙计很符合策略模式的定义。诸葛亮的3个锦囊妙计的设计图如下:

 

 

 

 

 

       赵云扮演了环境角色,而开后门、开绿灯、阻追兵则是具体的策略。诸葛亮的设定的这些“锦囊妙计”的做法便是抽象策略。

 

 

 

 

待续.....

 

 

原创粉丝点击