关闭

设计模式(八)——策略模式

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

也称作政策模式(Policy Pattern)

Define a family of algrithuns, encapusulate each one ,and make them interchagenable

定义一组算法,将每个算法都封装起来,并且使他们之间可以互换

类图



Context封装角色:

          也叫作上下文,起承上启下封装做用,屏蔽高层模块对策略算法的直接访问,封装可能存在的变化。与Strategy是聚合关系

Strategy抽象策略角色:

         策略、算法家族的抽象,通常为接口,定义每个策略或者算法必须具有的方法和属性。

ConcreteStrategy具体决策实现类:

         实际抽象策略中的操作,该类具有具体的算法


代码实现



public interface Strategy {
	//策略模式的运算法则
	public void doSth();
}

public class ConcreteStrategyA implements Strategy {

    @Override
    public void doSth() {
        System.out.println("策略1,....人之初,性本善");
    }

}

public class ConcreteStrategyB implements Strategy {

    @Override
    public void doSth() {
        System.out.println("策略2,....36计,走为上策");
    }

}

/**
 * 封装类
 * @author isc
 *
 */
public class Context {

    //抽象策略
    private Strategy strategy=null;
    //构造函数中设置策略
    public Context(Strategy strategy){
        this.strategy=strategy;
    }
    //封装后的策略方法
    public void doAntThing(){
        this.strategy.doSth();
    }

} 

测试类:

public class Client {

	public static void main(String[] args) {
		// 声明一个具体的策略
		Strategy strategy1 = new ConcreteStrategyA();
		Strategy strategy2 = new ConcreteStrategyB();

		//声明上下文对象
		Context ctx1 = new Context(strategy1);
		ctx1.doAntThing();

		Context ctx2 = new Context(strategy2);
		ctx2.doAntThing();

	}

}

输出:

策略1,....人之初,性本善
策略2,....36计,走为上策

优缺点:

优点:

算法可以自由切换,只要实现具体抽象类,就可以成为策略家族的一个成员,通过封装角色对其进行封装,可以实现自由切换;

扩展性良好:在现有系统中增加一个策略它容易了,只需要实现接口就行了。

缺点:

策略类数量多,复用可能小;

所有策略都需要对外暴露才能决定使用哪个策略。

策略家族中的具体策略数超过4个则需要考虑使用混合模式,决绝策略类膨胀和对外暴露的问题,否则日后维护不便。


使用场景

多个类只有在算法或者行为上稍有不同的场景:算法需要自由切换,需要屏蔽算法规则的场景。

例子1:一个菜单功能能够根据用户的“皮肤”首选项来决定是否采用水平的还是垂直的排列形式。同事可以灵活增加菜单那的显示样式。

例子2:出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。


策略模式与代理模式区别

  <代理模式类图>


可以看出,策略模式封装角色和被封装策略不是同一个接口,而代理模式的封装角色和被代理角色都实现统一个接口。


策略枚举

/**
 * 抽象类的元素默认去实现一遍构造函数即相当于创建此类的一个实例,需要先实现其中定义的抽象方法
 * @author isc
 */
public enum ConcretStrategy {

	StrategyA(){
		@Override
		public void doSth() {
			System.out.println("策略1....");
		}
	},

	StrategyB(){
		@Override
		public void doSth() {
			System.out.println("策略2....");
		}
	};

	//声明一个抽象函数
	public abstract void doSth();
}

public class Client {

    public static void main(String[] args) {

        ConcretStrategy.StrategyA.doSth();
        ConcretStrategy.StrategyB.doSth();
    }

}

 

把原有定义在抽象策略中的方法移植到枚举中,每个枚举成员就变成了一个具体的策略,枚举策略是一个比较优秀和方便的模式,但是它收到枚举类型的限制,每个枚举项都是public\static\final的,扩展性收到一定的约束,因此在系统开发中,比较适合担当不经常发生变化的角色。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Java设计模式之策略模式

本文属于23种设计模式系列。 介绍的是策略模式。
  • jason0539
  • jason0539
  • 2015-04-13 07:20
  • 33547

我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通...
  • LCL_data
  • LCL_data
  • 2013-08-24 10:59
  • 12658

设计模式C++实现——策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。         策略模式UML图如下:           举例:      ...
  • walkerkalr
  • walkerkalr
  • 2014-06-04 15:32
  • 1301

设计模式解读之一: 策略模式——鸭子游戏.doc

  • 2011-03-20 16:48
  • 12.37MB
  • 下载

设计模式——策略模式

  • 2014-12-14 16:56
  • 92KB
  • 下载

JAVA设计模式(八)——策略模式

1、策略模式         策略模式也是行为模式之一,它对一系列的算法进行封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装实现和实现。具体的算法选择交给客户端决定...
  • ljtyzhr
  • ljtyzhr
  • 2015-01-12 22:05
  • 491

【设计模式】策略模式——以商场促销为例

本文内容参考自《大话设计模式》(程杰 著) 注:以下代码为java实现版本1需求:做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。关键代码:public class Cash {...
  • jiange_zh
  • jiange_zh
  • 2015-12-04 14:25
  • 1999

设计模式(Design Pattern)——策略模式

设计模式(Design Pattern)——策略模式Tags: java, 设计模式, 策略  设计模式也是老生常谈的话题了,这里老衲也就做一个自己归纳的小结论,设计模式其实就是编程经验复用,不局限于...
  • u012402505
  • u012402505
  • 2018-01-02 13:31
  • 31

Java23种设计模式——策略模式

策略模式
  • qq_29951983
  • qq_29951983
  • 2017-11-14 17:27
  • 56

从真实项目中抠出来的设计模式——第一篇:策略模式

有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个cs上万行代码这样场景是有发生, 当然这里也包括我。。。所以时间充裕一点之后就想重构一下,...
  • huangxinchen520
  • huangxinchen520
  • 2017-03-22 17:17
  • 111
    个人资料
    • 访问:48180次
    • 积分:1494
    • 等级:
    • 排名:千里之外
    • 原创:97篇
    • 转载:41篇
    • 译文:0篇
    • 评论:24条
    最新评论