策略模式

    【策略模式】:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到客户代码;

策略模式是一种定义一系列的算法的方法,从概念上来看,所有这些算法完成的是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

换句话说,策略模式是用来封装算法的。

【示例代码】:

// 算法抽象基类;

using System;

abstract class Strategy

{

    public abstract void AlgorithmInterface();

}

//实际实现算法A

class ConcreteStrategyA : Strategy

{

    public override void AlgorithmInterface()

    {

        Console.WriteLine("算法A实现");

    }

}

//实际实现算法B

class ConcreteStrategyB : Strategy

{

    public override void AlgorithmInterface()

    {

        Console.WriteLine("算法B实现");

    }

}

//实际实现算法C

class ConcreteStrategyC : Strategy

{

    public override void AlgorithmInterface()

    {

        Console.WriteLine("算法C实现");

    }

}

// Context 上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用;

class Context

{

    Strategy strategy;

    public Context(Strategy strategy)

    {

        this.strategy = strategy;

    }

    //上下文接口;

    public void ContextInterface()

    {

        strategy.AlgorithmInterface();

    }

}

class APP

{

    static void Main()

    {

        Context context;

        context = new Context(new ConcreteStrategyA());

        context.ContextInterface();

        context = new Context(new ConcreteStrategyB());

        context.ContextInterface();

        context = new Context(new ConcreteStrategyC());

        context.ContextInterface();

        Console.Read();

    }

}

实例:商场促销

【实现代码】

using System;

abstract class CashSuper

{

public abstract void AcceptCash();

}

class CashNormal:CashSuper

{

public override void AcceptCash()

{

Console.WriteLine("Sells Normal!");

}

}

class CashRebate:CashSuper

{

public override void AcceptCash()

{

Console.WriteLine("Rebate Selling!");

}

}

class CashReturn:CashSuper

{

public override void AcceptCash()

{

Console.WriteLine("Sells Return!");

}

}

class CashContext

{

private CashSuper cashSuper;

public CashContext(CashSuper cashSuper)

{

this.cashSuper=cashSuper;

}

public void GetResult()

{

cashSuper.AcceptCash();

}

}

class App

{

static void Main()

{

CashContext ch=new CashContext(new CashNormal());

ch.GetResult();

CashContext ch2=new CashContext(new CashRebate());

ch2.GetResult();

CashContext ch3=new CashContext(new CashReturn());

ch3.GetResult();

Console.Read();

}

}

时间: 2025-01-30 13:25:09

策略模式的相关文章

php设计模式之策略模式

策略模式: 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性思想. 策略模式的三个角色: 1.抽象策略角色 2.具体策略角色 3.环境角色(对抽象策略角色的引用) 实现步骤: 1.定义抽象角色类(定义好各个实现的共同抽象方法) 2.定义具体策略类(具体实现父类的共同方法) 3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)

php设计模式 Strategy(策略模式)

复制代码 代码如下: <?php /** * 策略模式(Strategy.php) * * 定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,使用得算法的变化可独立于使用它的客户 * */ // ---以下是一系列算法的封闭---- interface CacheTable { public function get($key); public function set($key,$value); public function del($key); } // 不使用缓存 class

策略模式(Strategy Pattern) 详解

策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法, 重新设定接口的行为. 提供行为的调用的方法(如perform), 需要调用接口(interface)的固有方法(fly & quack)即可. 代码: package strategy; public abstract class Duck

PHP的策略模式

策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想. 也就是我们打算出行旅游,我们可以有几个策略可以考虑,可以骑自行车,汽车,做火车,飞机. [策略模式中主要角色] 环境类(Context):用一个ConcreteStrategy对象来配置.维护一个对Strategy对象的引用.可定义一个接口来让Strategy访问它

传统设计模式(一)策略模式

虫子以前在一家电商公司 会员的模块在这里分类很明确 不同的会员所具有的权限和行为不同,大多程序员会使用标准的oo技术,设计一个会员超类SuperUser,并让各种商家会员继承此超类 到这里无可厚非,但是在下面个过程中你可以就慢慢体会策略模式与你在代码里不停写逻辑判断所带来的区别有多大 所有的会员都具有下列行为 购物,评价,发布商品 public abstract class SuperUser { public SuperUser() { } public void shopping() { C

VPN站点的路由(隧道、接口)模式及策略模式

常接触思科设备的都知道,目前使用IPsec协议建立的VPN站点都是无法使用路由的,要么采用GRE技术,GRE over IPsec可以实现路由,不过那样配置复杂不说,由于2次封装,每个数据包的有效载荷小了很多,效率性就不好了.也只能说目前,看ASA的进化方向,没准不知道什么时候就导入了. 而且目前采用策略模式的是大部分厂家的设备,cisco就不必说了,比如微软的ISA.SonicWall.D-link等:我目前发现支持路由模式的就只有两家,juniper的SSG和fortigate,要说起这两个

策略模式-排序算法

[关键字]:java,design pattern,设计模式,<Java与模式>学习,Strategy Pattern,策略模式 [环境]:StarUML5.0 + JDK6 [作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys/ [正文]: 策略模式:排序算法

解读设计模式:策略模式(Strategy Pattern)

一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应用OOP的设计过程演化(三)这篇文章里应用到了策略模式,在图书的租金计算上分多种情况,每一种不同类型的图书的租金是不一样的,而站在用户的角度来看,不同类型用户的租金收取又是不一样的,见下面分析: 计算机类图书:会员租借打5折,普通顾客租借打6折. 小说类图书:会员租借打6折,普通顾客租借打8折. 生活类图书:会员租借打9

php设计模式介绍之策略模式

在编写面向对象的代码的时,有些时候你需要一个能够自己根据不同的条件来引入不同的操作对象实 例.例如,一个菜单功能能够根据用户的"皮肤"首选项来决定是否采用水平的还是垂直的 排列形式,或者一个计费系统可以自行根据用户的收货地址来决定税率. 一般来讲,一个控制菜 单的对象实例包括了add(), delete(), 和 replace()等菜单元素:并通过set()进行配置,用render() 来管理显示模式.无论你想生成什么样子的菜单,你都可以用同一个对象类来处理.不同菜单的对象实 例只是

PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)

观察者模式 /** * 定义观察接口 */ interface Subject { public function Attach($Observer); //添加观察者 public function Detach ($Observer); //踢出观察者 public function Notify(); //满足条件时通知观察者 public function SubjectState($Subject); //观察条件 } /** * 观察类的具体实 现 */ class Boss Imp