二、策略模式

1 策略模式实际上就是应对有各种策略(实现方法)的需求。比如超市促销,有多种多样的促销策略,这时候就要想到策略模式,策略模式一般会配合工厂模式使用。

代码如下:

package com.biao.strategy.original;
/**
 *
 * @author biao
 * 策略模式:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用
 *        算法的客户。
 *
 * 应用:商场各种促销方案。
 *
 * 记忆方法:一个超类的算法家族+一个context容器。容器内通过构造方法注入一个超类的引用,容器内写一个方法,实现注入的对象去调用具体的算法。
 */
public class StrategyDemo {
    public static void main(String[] args) {

        //缺点:此处为逻辑部分,逻辑应该和界面分离,这里相当于判断多种方法,应该放到逻辑处理中,综合简单工厂模式,
        //将判断创建哪一种对象的逻辑放入具体类中处理。
        Context contextA = new Context(new ConcreteStrategyA());
        Context contextB = new Context(new ConcreteStrategyB());

        contextA.contextInterface();
        contextB.contextInterface();

    }
}
//抽象算法类,算法接口用于不同的实现方式
abstract class Strategy{
    abstract public void AlgorithmInterface();
}

//具体算法1
class ConcreteStrategyA extends Strategy{

    @Override
    public void AlgorithmInterface() {
        // TODO Auto-generated method stub
        System.out.println("算法一的实现方案");
    }

}
//具体算法2
class ConcreteStrategyB extends Strategy{

    @Override
    public void AlgorithmInterface() {
        // TODO Auto-generated method stub
        System.out.println("算法二的实现方案");
    }
}

//Context类,用来维护一个Strategy,然后调用该具体类的算法。其实就是通过构造方法注入。
class Context{
    Strategy strategy;
    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public void contextInterface(){
        strategy.AlgorithmInterface();
    }
}

如上demo中,主函数中创建容器(Context)的时候,需要用户自己注入不同的对象,实际相当于用户去判断传入什么对象,这个判断逻辑通过工厂的方法生成。(实际并没变化,容器中任然维护一个策略超类的引用)代码如下:

package com.biao.strategy.simplefactory;

/**
 *
 * @author biao
 * 工厂模式和策略模式的简单结合。策略模式用于封装一些算法,供客户端调用。
 * 但是具体创建哪一个策略,是逻辑判断部分,利用工厂模式的多态,生成不同算法的
 * 对象,然后调用该对象的算法。
 */
public class StrategyFactoryDemo {
	public static void main(String[] args) {
		Context contextA = new Context("模式A");
		Context contextB = new Context("模式B");

		contextA.contextInterface();
		contextB.contextInterface();
	}
}
//抽象算法类,算法接口用于不同的实现方式
abstract class Strategy{
	abstract public void AlgorithmInterface();
}

//具体算法1
class ConcreteStrategyA extends Strategy{

	@Override
	public void AlgorithmInterface() {
		// TODO Auto-generated method stub
		System.out.println("算法一的实现方案");
	}

}
//具体算法2
class ConcreteStrategyB extends Strategy{

	@Override
	public void AlgorithmInterface() {
		// TODO Auto-generated method stub
		System.out.println("算法二的实现方案");
	}
}

//Context类,用来维护一个Strategy,然后调用该具体类的算法。
class Context{
	Strategy strategy;
	public Context(String flag){
		switch(flag){
		case "模式A":
			strategy = new ConcreteStrategyA();
			break;
		case "模式B":
			strategy = new ConcreteStrategyB();
			break;
		}
	}
	public void contextInterface(){
		strategy.AlgorithmInterface();
	}
}
时间: 2024-11-08 02:15:02

二、策略模式的相关文章

领域驱动系列二策略模式的应用

一.简介 随着模型的不断扩大,发现模型中不单单只有"名词",还有许多"谓词",简言之,就是领域知识中,会参杂者许多的业务规则,他们和实体一样,都扮演者领域模型中的核心角色. 所以我们在建立领域模型的时候,不单单只关注实体和值对象,业务规则也被纳入到了领域模型中,如果业务规则变化不频繁,我们可以使用硬编码来解决,但是实际开发中业务规则的变化往往是变化的非常频繁的.当然你可以使用大量的If else来解决这个问题,但是这种代码是很难维护的.而且会影响原先的业务,所以这个

设计模型之二策略模式

//strategy model //策略模式是一种定义一系列算法的方法 #include<iostream> using namespace std; //一个抽象的策略类 class Strategy{ public: virtual void algorithmInterface()=0; }; //三种不同策略 class StrategyA:public Strategy{ void algorithmInterface() { cout<<"A strateg

二 策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合 策略模式封装了变化 在实践中,我们发现可以用它来封装几乎任类型的规则,只要在分析过程中听到需要在不同时间应用到不同的业务规则,就考虑使用策略模式来处理这种变化的可能 商场促销例子 现金收费抽象类 using System; using System.Collections.Generic; using System.Linq;

计算器软件的代码实现 (策略模式)

一 封装时策略模式的书写 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace shuxuefudao { class qita { public void qingkong() { File.WriteAllText("writer.txt", string.Empty); File.WriteAllText(&q

设计模式(1)--简单工厂模式、策略模式

1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 先放图再解释.下图一是从<大话设计模式>中摘出来的.问题是:用任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 简单工厂模式实现的关键点有两个: 1. 继承:定义一个抽象父类“抽象产品”(Operation类

二、策略模式-商场促销活动

以商场收银为例,理解并实践"策略模式". 简单商场促销活动描述:营业员提供商品单价.数量.商场目前的活动(满减.打折等),计算用户最终需要支付的金额. 一.面向过程的实现方式 1 package secondStrategy; 2 import java.text.DecimalFormat; 3 public class StrategyTest { 4 public static void main(String[] args) { 5 // 营业员提供信息 6 double to

设计模式实现(二)——策略模式的C++实现

一.策略模式的概念 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 二.例子 (1) Strategy抽象类的实现 1 #ifndef STRATEGY_H 2 #define STRATEGY_H 3 4 class Strategy { 5 public: 6 Strate

&amp;lt;二&amp;gt;读&amp;lt;&amp;lt;大话设计模式&amp;gt;&amp;gt;之策略模式

又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.client依赖两个类.耦合性高:2.假设算法过多则须要写非常多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族.分别封装起来.让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单位价格*打

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

又和大家见面了,能够坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了.读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.客户端依赖两个类,耦合性高:2.如果算法过多则需要写很多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单价*打折算法=售价.