Java设计模式---策略模式

7人阅读 评论(0) 收藏 举报
分类:


适用场景

1.      许多相关的类仅仅是行为差异

2.      运行时选取不同的算法变体

3.      通过条件语句在多个分支中选取一

策略模式的优缺点

优点:

(1)      提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公用的代码移到父类里面,从而可以避免重复的代码。

(2)      策略模式提供了可以替换继承关系的办法。继承可以处理多种算法行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不能再独立烟花。继承使得动态改变算法或行为变得不可能。

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

缺点:

(1)      客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。

(2)      策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。



何时使用:

    

策略模式:将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。

策略模式中的设计原则:变化的抽象成接口;面向接口编程而不是面向实现编程。

使用场景:

    

 public static void main(String[] args) {
 7 
 8         //加法
 9         Context context=new Context(new AddStrategy());
10         System.out.println(context.calculate(10, 5));
11         //减法
12         Context context2=new Context(new SubstractStrategy());
13         System.out.println(context2.calculate(3, 2));
14         //乘法
15         Context context3=new Context(new MultiplyStrategy());
16         System.out.println(context3.calculate(6, 8));
17         //除法
18         Context context4=new Context(new DivisionStrategy());
19         System.out.println(context4.calculate(90, 9));    
20     }



具体实现:

    抽象类A,有抽象方法a()

         A1/A2/A3实现A的抽象方法a()

            创建持有类A对象的类B,内容如下

                    

 1 public class B{
 2 
 3     private Strategy strategy;
 4     
 5     public Context(Strategy strategy) {
 6         super();
 7         this.strategy = strategy;
 8     }
 9 
10     public Strategy getStrategy() {
11         return strategy;
12     }
13 
14     public void setStrategy(Strategy strategy) {
15         this.strategy = strategy;
16     }
17     public int calculate(int a,int b){
18         return strategy.calculate(a, b);
19     }
20 }


    

    

查看评论

使用数据库保存session的方法

作者:liuphy   发表日期:2000年12月20日   阅读次数:98     php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当...
  • terrywang
  • terrywang
  • 2000-12-21 23:27:00
  • 589

Java设计模式——Comparable接口&&Comparator(CC系)策略模式的应用

Comparable接口&&Comparator接口:突然想起了民国时期的CC系,哈哈^_^ 转自:http://www.cnblogs.com/baizhanshi/p/6201875.html ...
  • scliu12345
  • scliu12345
  • 2017-03-04 17:17:52
  • 466

Java设计模式——策略模式实现及原理

简介 定义 策略模式:将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。 策略模式中的设计原则:变化的抽象成接口;面向...
  • Goskalrie
  • Goskalrie
  • 2016-09-08 16:22:11
  • 3406

大话设计模式—策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。大话设计模式中程杰老师给出的定义是这样的:策略模式(Strategy),定义了...
  • lmb55
  • lmb55
  • 2016-03-23 23:59:47
  • 2164

Java设计模式——策略模式(Strategy Pattern)

Java设计模式——策略模式(Strategy Pattern) 场景一 描述:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,...
  • u012401711
  • u012401711
  • 2016-09-07 21:16:14
  • 1712

Head First 设计模式学习笔记 ——策略模式

Head First 设计模式学习 ——策略模式简单理解     问题来源:     在子类继承父类时,如果子类不需要使用父类中的某些方法,该如何处理?     举个例子,如下图所示,父类Duck类抽...
  • u010429424
  • u010429424
  • 2016-07-27 19:22:41
  • 539

java设计模式之策略模式及项目中的应用

今天开始,我们LazyCoder准备着手开发一款模拟人生游戏,首先从设计人物开始,我们设想我们设计的人物可以讲话,吃东西,睡觉,他们的样子也都不一样。我们想到了继承,于是有了第一个类Person,之后...
  • zcm101
  • zcm101
  • 2013-07-17 17:00:34
  • 2617

策略模式-商场促销-大话设计模式

类结构://父类,商场结账的算法 public interface SuperCash { //得到算过后的结账金额 public double getcash(double cash); }//...
  • wxwzy738
  • wxwzy738
  • 2012-05-31 19:43:18
  • 2152

重构:switch语句改成策略模式还是状态模式

在重构篇里,可以用多态来取代switch语句,但是因为:一部影片可以在生命周期内修改自己的分类,一个对象却不能在生命周期内修改自己所属的类。所以这里不能用策略模式,用多态取代switch,而应该用状态...
  • qq_21381465
  • qq_21381465
  • 2016-05-02 22:32:23
  • 2317

java 设计模式 策略模式,comparable 接口,compareTo 方法

重点在于判断 对象   谁大谁小 尤其是比较类对象的 “谁大谁小” 打印类对象 print(a) 必须在类里要重写 toString() 方法 @Override public Str...
  • yuyi_000
  • yuyi_000
  • 2015-07-20 22:16:20
  • 519
    个人资料
    等级:
    访问量: 3506
    积分: 139
    排名: 116万+
    文章分类
    最新评论