设计模式15:Strategy(策略模式)

合集下载

23种设计模式

23种设计模式

设计模式的分类1.抽象工厂Abstract FACTORY厂模式:客户类和工厂类分开,把各种需要使用到的实例的创建方法统一单独写成抽象类,实现类具体实现创建过程,创建出来的对象类型用接口来表示,抽象工厂可以用在高层类中使用,不用考虑太多具体的创建细节,如何创建由工厂的具体实现去定义。

核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

2.BUILDER建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。

建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。

建造模式可以强制实行一种分步骤进行的建造过程。

3.FACTORY METHOD工厂方法模式:用一个方法来创建所需要的所有实例,跟抽象工厂的区别,就是不需要单独写个工厂类,相当于把抽象工厂类里面定义的抽象方法,合并到应用类里面,子类去实现就好了,比抽象工厂更简洁。

4. PROTOTYPE原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。

原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。

缺点是每一个类都必须配备一个克隆方法。

5.SINGLETON单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。

单例模式只应在有真正的“单一实例”的需求时才可使用。

6.ADAPTER适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。

适配类可以根据参数返还一个合适的实例给客户端。

7.BRIDGE桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

oop的三种设计模式(单例、工厂、策略)

oop的三种设计模式(单例、工厂、策略)

oop的三种设计模式(单例、⼯⼚、策略)单例模式:废话不多说,我们直接上代码:<?php/**三私⼀公*私有的静态属性:保存类的单例*私有的__construct():阻⽌在类的外部实例化*私有的__clone():阻⽌在类的外部clone对象*共有的静态⽅法:获取类的单例*/class DanLi{private static $instance; //保存类的单例private function __construct() { //阻⽌在类的外部实例化}private function __clone() { //阻⽌在类的外部clone对象}//获取当前类的单例public static function getInstance() {if(!self::$instance instanceof self)//$instance中保存的不是MySQLDB类的单例就实例化self::$instance=new self();return self::$instance; //返回单例}}//测试$db1=DanLi::getInstance();$db2=DanLi::getInstance();var_dump($db1,$db2);我们可以看到结果为下图:我们可以看到,结果为:两个实例化出来对象是⼀样的。

这就体现了我们单例的精髓(只能实例化出来⼀个实例,并且不可复制,能够节省系统资源)注意:静态变量上存在内存中的,它不会因为程序执⾏完毕⼆消失,所以我们第⼆次实例化的时候,会检测到instance的存在,因⽽直接返回已经存在的instance实例。

下⾯我们来看⼀下单例的实际运⽤:⽤于数据库连接类,因为是数据库连接,我们没有必要每⼀次操作数据库都进⾏⼀次数据库类的实例化,那样会⼤⼤的消耗系统资源。

所以,我们⽤到了单例模式,代码如下://初始化连接参数private function initParam($config){$this->host=isset($config['host'])?$config['host']:'';$this->port=isset($config['port'])?$config['port']:'3306';$this->user=isset($config['user'])?$config['user']:'';$this->pwd=isset($config['pwd'])?$config['pwd']:'';$this->charset=isset($config['charset'])?$config['charset']:'utf8';$this->dbname=isset($config['dbname'])?$config['dbname']:'';}private function connect(){$this->link=@mysql_connect("{$this->host}:{$this->port}",$this->user,$this->pwd) or die('数据库连接失败');}private function setCharset(){$sql = "set names '{$this->charset}'";$this->query($sql);}private function selectDB(){$sql = "use `{$this->dbname}`";$this->query($sql);}private function __construct($config){$this->initParam($config);$this->connect();$this->setCharset();$this->selectDB();}private function __clone(){}public static function getInstance($config=array()) {if(!self::$instance instanceof self)self::$instance=new self($config);return self::$instance;}public function query($sql){if(!$result=mysql_query($sql,$this->link)){echo 'sql语句执⾏失败<br />';exit;}return $result;}}$config=array('host' => '127.0.0.1','user' => 'root','dbname' => 'accounts'$db = Test::getInstance($config);$sql = "select * from acc_wechat";$info = $db->query($sql);while($rows = mysql_fetch_row($info)){//echo $rows[1].'<br>';//var_dump($rows);echo $rows[0].'-'.$rows[1].'<br />';}var_dump($info);>通过以下代码,我们就⼤体了解了:单例的原理及实际运⽤。

设计模式主要分三个类型

设计模式主要分三个类型

设计模式主要分三个类型:创建型、结构型和行为型。

其中创建型有:一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。

三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。

四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。

五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

行为型有:六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。

七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。

八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。

九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。

十、State,状态模式:允许对象在其内部状态改变时改变他的行为。

对象看起来似乎改变了他的类。

十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。

十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。

.Net23种设计模式

.Net23种设计模式

.Net23种设计模式C#常见的设计模式⼀、概要:模式分为三种,设计模式、体系结构模式与惯⽤法。

其中惯⽤法是⼀种语⾔紧密相关的模式,例如,定界加锁模式其实是⼀种惯⽤法。

在C#项⽬开发过程中,很多情况下您已经使⽤了某些模式,但或许您并不知道⾃⼰所使⽤的这种解决⽅案是⼀种已经被总结归纳的模式。

⼯⼚、策略、桥接、模板⽅法、代理等等23种Gof经典模式是属于设计模式,设计模式的粒度相对较⼩,基本上⽤于提⾼模块内部的可扩展性和可维护性需求三层、MVC、IoC/DI等属于体系结构模式,粒度⽐设计模式⼤,它是从项⽬的整体⾓度去看项⽬的架构。

设计需要合理性,架构同样追求合理性,这就是架构模式的⽤途。

C#的经典样例petshop中,采⽤分层思想构架了整个⽹站,这⾥的分层就是体系结构模式;⽽在数据库访问层,则采⽤⼯⼚模式来泛化数据库操作,使得业务层不需要关⼼您现在的数据库是SQL server的,还是oracle的。

这就是设计模式的使⽤。

模式应⽤不是⼀两句话能够说清楚的,也不是⼀天两天能够体会的,需要楼主慢慢体会与学习。

⼆、分类⽬录:创建型:1. 单件模式(Singleton Pattern)2. 抽象⼯⼚(Abstract Factory)3. 建造者模式(Builder)4. ⼯⼚⽅法模式(Factory Method)5. 原型模式(Prototype)结构型:6. 适配器模式(Adapter Pattern)7. 桥接模式(Bridge Pattern)8. 装饰模式(Decorator Pattern)9. 组合模式(Composite Pattern)10. 外观模式(Facade Pattern)11. 享元模式(Flyweight Pattern)12. 代理模式(Proxy Pattern)13. 模板⽅法(Template Method)14. 命令模式(Command Pattern)15. 迭代器模式(Iterator Pattern)⾏为型:16. 观察者模式(Observer Pattern)17. 解释器模式(Interpreter Pattern)18. 中介者模式(Mediator Pattern)19. 职责链模式(Chain of Responsibility Pattern)20. 备忘录模式(Memento Pattern)21. 策略模式(Strategy Pattern)22. 访问者模式(Visitor Pattern)23. 状态模式(State Pattern)C# 23种设计模式China Document 4 Colors1.1节⼯期How are you1.1.1 完成⽇期1.2节创建型模式1.2.1 单件模式(Singleton Pattern)动机(Motivation):在软件系统中,经常有这样⼀些特殊的类,必须保证它们在系统中只存在⼀个实例,才能确保它们的逻辑正确性、以及良好的效率。

headfirst设计模式java_吐血整理HeadFirst设计模式大全

headfirst设计模式java_吐血整理HeadFirst设计模式大全

headfirst设计模式java_吐血整理HeadFirst设计模式大全首先,要理解Head First设计模式,需要明白设计模式的概念。

设计模式是在软件开发中经过实践验证的解决方案,它们是解决特定问题的经验总结。

Head First系列是一本非常经典的计算机科学图书系列,其中《Head First设计模式》专门介绍了23种常见的设计模式,并以Java语言进行讲解。

本书从实际问题出发,用生动形象的方式讲解设计模式,以帮助读者更好地理解和应用这些设计模式。

下面将介绍一些书中提到的设计模式和其在Java编程中的应用。

1. 策略模式(Strategy Pattern):策略模式将一组行为封装成策略类,使其在运行时可以相互替换。

在Java中,可以使用接口来定义策略,不同的策略类实现相同的接口,根据不同情况选择不同的策略。

2. 观察者模式(Observer Pattern):观察者模式定义了对象间的一种一对多的关系,当一个对象状态改变时,所有依赖它的对象都会被通知并自动更新。

在Java中,可以使用java.util.Observable类和java.util.Observer接口来实现观察者模式。

3. 装饰者模式(Decorator Pattern):装饰者模式动态地将责任附加到对象上,通过创建一个装饰者类来包装原始对象,以提供额外的功能。

在Java中,可以通过继承原始对象并添加额外功能的方式来实现装饰者模式。

4. 工厂模式(Factory Pattern):工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。

在Java中,可以使用工厂方法模式来实现,通过定义一个工厂接口和具体的工厂类来创建实例。

5. 单例模式(Singleton Pattern):单例模式确保一个类只有一个实例,并提供一个全局访问点。

在Java中,可以使用私有构造函数和静态方法来实现单例模式。

以上只是其中一部分介绍的设计模式,还有其他如适配器模式、迭代器模式、模板方法模式等。

23种设计模式

23种设计模式

23种设计模式设计模式主要三类型:创建型、结构型⾏型其创建型:⼀、Singleton单例模式:保证类实例并提供访问全局访问点⼆、Abstract Factory抽象⼯⼚:提供创建系列相关或相互依赖象接⼝须指定具体类三、Factory Method⼯⼚:定义⽤于创建象接⼝让类决定实例化哪类Factory Method使类实例化延迟类四、Builder建造模式:复杂象构建与表⽰相离使同构建程创建同表⽰五、Prototype原型模式:⽤原型实例指定创建象种类并且通拷贝些原型创建新象⾏型:六、Iterator迭代器模式:提供顺序访问聚合象各元素需要暴露该象内部表⽰七、Observer观察者模式:定义象间依赖关系象状态发改变所依赖于象都通知⾃更新⼋、Template Method模板:定义操作算⾻架些步骤延迟类TemplateMethod使类改变算结构即重定义该算某些特定步骤九、Command命令模式:请求封装象使⽤同请求客户进⾏参数化请求排队记录请求志及⽀持撤销操作⼗、State状态模式:允许象其内部状态改变改变⾏象看起似乎改变类⼗⼀、Strategy策略模式:定义系列算封装起并使互相替换本模式使算独⽴于使⽤客户⼗⼆、China of Responsibility职责链模式:使象都机处理请求避免请求送发者接收者间耦合关系⼗三、Mediator介者模式:⽤介象封装些列象交互⼗四、Visitor访问者模式:表⽰作⽤于某象结构各元素操作使改变各元素类前提定义作⽤于元素新操作⼗五、Interpreter解释器模式:给定语⾔定义⽂表⽰并定义解释器解释器使⽤该表⽰解释语⾔句⼗六、Memento备忘录模式:破坏象前提捕获象内部状态并该象外保存状态结构型:⼗七、Composite组合模式:象组合树形结构表⽰部整体关系Composite使⽤户单象组合象使⽤具致性⼗⼋、Facade外观模式:系统组接⼝提供致界⾯fa?ade提供⾼层接⼝接⼝使系统更容易使⽤⼗九、Proxy代理模式:其象提供种代理控制象访问⼆⼗、Adapter,适配器模式:类接⼝转换客户希望另外接⼝Adapter模式使原本由于接⼝兼容能起⼯作些类起⼯作⼆⼗⼀、Decrator装饰模式:态给象增加些额外职责增加功能说Decorator模式相⽐类更加灵⼆⼗⼆、Bridge桥模式:抽象部与实现部相离使独⽴变化⼆⼗三、Flyweight享元模式。

23种设计模式

23种设计模式(Design Patterns)设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。

一、总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

还用两类模式:并发型模式和线程池模式。

二、设计模式六大原则:总原则:开闭原则开闭原则就是说对扩展开放,对修改关闭。

在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。

所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。

想要达到这样的效果,我们需要使用接口和抽象类等。

1、单一职责原则不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。

2、里氏替换原则(Liskov Substitution Principle)里氏代换原则(Liskov Substitution Principle LSP)是面向对象设计的基本原则之一。

里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

里氏代换原则是对“开-闭”原则的补充。

23种设计模式 详解

23种设计模式详解设计模式是指面向对象编程中,经过多次验证、被广泛接受的代码实现方法。

这些设计模式可以帮助开发者更快地解决问题,提高代码的可读性、可维护性、可扩展性。

目前,常用的设计模式有23种。

下面,我们来详细介绍一下这23种设计模式。

1. 单例模式(Singleton)单例模式是一种只允许生成一个实例的模式。

在实例化对象时,单例模式的生成过程比较特殊,需要先判断该类是否已经实例化过,如果已经实例化,则直接返回已有的实例对象,否则再进行实例化。

2. 工厂模式(Factory)工厂模式是一种生产对象实例的设计模式。

它将对象实例的生成过程封装在一个工厂类中,客户端需要对象时,只需要调用工厂类中对应的方法即可。

3. 抽象工厂模式(Abstract Factory)抽象工厂模式是一种扩展了工厂模式的模式。

它可以生成一系列相关或相互依赖的对象实例。

具体实现时,通常需要定义一个抽象工厂类和一些具体工厂类,来生产各种相关的对象实例。

4. 建造者模式(Builder)建造者模式是一种用于构建复杂对象的模式。

它将一个复杂对象的构建过程分解成多个简单的步骤,然后通过一个指挥者来管理这些步骤的执行,最终构建出一个复杂的对象。

5. 原型模式(Prototype)原型模式是一种通过复制已有对象来创建新对象的模式。

一般来说,系统中的对象包含大量相同或相似的部分,通过复制对象可以帮助我们节省生成对象的时间和资源。

6. 适配器模式(Adapter)适配器模式是一种将不兼容接口转换为兼容接口的模式。

具体实现时,需要定义一个适配器类,该类实现了客户端所期望的接口,而且还包装了原有不兼容的接口,使其能够兼容客户端期望的接口。

7. 桥接模式(Bridge)桥接模式是一种将抽象部分与其实现部分分离开来的模式。

具体实现时,需要定义抽象部分和实现部分的接口,然后定义一个桥接类,将抽象部分和实现部分联系起来。

8. 组合模式(Composite)组合模式是一种将具有相同属性和方法的对象组合成树形结构的模式。

设计模式面试题目(3篇)

第1篇一、设计模式概述1. 什么是设计模式?设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

2. 设计模式的作用?(1)提高代码可重用性;(2)提高代码可维护性;(3)提高代码可读性;(4)保证代码可靠性;(5)降低系统复杂性。

3. 设计模式的分类?(1)创建型模式:创建对象实例的方法;(2)结构型模式:处理类和对象之间的关系;(3)行为型模式:处理对象之间的通信。

二、创建型模式1. 单例模式(Singleton)单例模式确保一个类只有一个实例,并提供一个全局访问点。

(1)单例模式的作用:- 避免创建多个实例,节省资源;- 保证全局访问点唯一。

(2)单例模式的实现方式:- 懒汉式:在需要时创建实例;- 饿汉式:在类加载时创建实例;- 双重校验锁:懒汉式,线程安全;- 静态内部类:懒汉式,线程安全。

2. 工厂方法模式(Factory Method)工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。

(1)工厂方法模式的作用:- 隐藏创建对象的过程;- 提供接口,让子类实现具体创建逻辑。

(2)工厂方法模式的实现方式:- 简单工厂模式:通过一个工厂类来创建对象;- 工厂方法模式:通过一个工厂接口和实现类来创建对象。

3. 抽象工厂模式(Abstract Factory)抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族。

(1)抽象工厂模式的作用:- 创建对象家族,而不需要指定具体类;- 提供一个接口,让子类实现具体创建逻辑。

(2)抽象工厂模式的实现方式:- 抽象工厂:提供一个接口,让子类实现具体创建逻辑;- 具体工厂:实现抽象工厂接口,创建对象家族。

4. 建造者模式(Builder)建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

(1)建造者模式的作用:- 将一个复杂对象的构建与表示分离;- 提供一个接口,让子类实现具体构建逻辑。

24种设计模式

24种设计模式Factory Pattern(⼯⼚模式):1. 创建对象的接⼝,封装对象的创建;2. 使具体化类的⼯作延迟到⼦类中。

(维护⼀类对象)AbstractFactory Pattern(抽象⼯⼚模型):该模式将⼀组对象的创建封装到⼀个⽤于创建对象的类中。

(解决的问题:要创建⼀组或者相互依赖的对象)。

Singleton Pattern(单例模式):该模式在⾯向纯粹的⾯向对象的范式中⽤于创建唯⼀的实例,值得注意的是Singleton不能被实例化,因此将其构造函数声明为protected或private类型。

Singleton Pattern经常与Factory Pattern结合使⽤,因为Factory对象只能有⼀个。

Builder Pattern(创建者模式):将⼀个复杂的对象的构建与它的表⽰分离,使得同样的构建构成可以创建不同的表⽰。

如建筑师画图纸,⽽⼯⼈建造房屋。

Prototype Pattern(原型模式):提供⼀个通过已存在对象进⾏新对象创建的接⼝(clone)。

(浅拷贝和深拷贝)Bridge Pattern(桥梁模式):将抽象部分与实现部分分开实现,使他们都可以独⽴地变化,并使⽤组合的⽅式将多维度的抽象⽅法联系在⼀起。

⽐如咖啡分⼩杯、中杯、⼤杯以及加奶和不加奶,则抽象部分为:⼩杯、中杯、⼤杯,⾏为为:加奶和不加奶。

Adapter Pattern(适配器模式):适配就是由“源”到“⽬标”的适配,⽽当中链接两者的关系就是适配器。

它负责把“源”过度到“⽬标”。

将⼀个类的接⼝转换成客户希望的另外⼀个接⼝。

Adapter模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。

适配器模式分为两种:①⾯向类的设计模式;②⾯向对象的设计模式。

①⾯向类的适配器:该模式使⽤继承和接⼝实现的⽅式复⽤需要适配器的类。

②⾯向对象的适配器:该模式使⽤组合的⽅式实现需要复⽤的类。

Decorator模式(装饰模式):动态地给⼀个对象添加⼀些额外的职责。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

无废话C#设计模式之十五:Strategy
意图:定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换。本模式使得算法可以独立于它的
客户而变化。
场景:在开发程序的时候,我们经常会根据环境不同采取不同的算法对对象进行处理。比如,在一个新闻列表页
面需要显示所有新闻,而在一个新闻搜索页面需要根据搜索关键词显示匹配的新闻。如果在新闻类内部有一个
ShowData方法的话,那么我们可能会传入一个searchWord的参数,并且在方法内判断如果参数为空则显示

所有新闻,如果参数不为空则进行搜索。如果还有分页的需求,那么还可能在方法内判断是否分页等等。
这样做有几个不好的地方,一是ShowData方法太复杂了,代码不容易维护并且可能会降低性能,二是如

果还有其它需求的话势必就需要修改ShowData方法,三是不利于重用一些算法的共同部分。由此引入策略模
式,把算法进行封装,使之可以灵活扩展和替换。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace StrategyExample{
class Program{
static void Main(string[] args) {
Data data = new Data();
data.Add("aaa");
data.Add("bbb");
data.Add("ccc");
data.Add("abc");
data.Show();
data.SetShowDataStrategy(new SearchData("a"));
data.Show();
data.SetShowDataStrategy(new ShowPagedData(2,1));
data.Show();
}
}
abstract class ShowDataStrategy{abstract public void ShowData(IList data); }
class ShowAllData : ShowDataStrategy{
public override void ShowData(IList data) {
for (int i = 0; i < data.Count; i++) {Console.WriteLine(data[i]); }
}
}
class ShowPagedData : ShowDataStrategy{
private int pageSize;
private int pageIndex;
public ShowPagedData(int pageSize, int pageIndex) {
this.pageSize = pageSize;
this.pageIndex = pageIndex;
}
public override void ShowData(IList data) {
for (int i = pageSize * pageIndex; i < pageSize * (pageIndex + 1); i++) {
Console.WriteLine(data[i]);
}
}
}
class SearchData : ShowDataStrategy{
private string searchWord;
public string SearchWord{
get { return searchWord; }
set { searchWord = value; }
}
public SearchData(string searchWord) {this.searchWord = searchWord; }
public override void ShowData(IList data) {
for (int i = 0; i < data.Count; i++) {
if (data[i].ToString().Contains(searchWord)) Console.WriteLine(data[i]);
}
}
}
class Data{
private ShowDataStrategy strategy;
private IList data = new ArrayList();
public void SetShowDataStrategy(ShowDataStrategy strategy) {
this.strategy = strategy;
}
public void Show(){
if (strategy == null) strategy = new ShowAllData();
Console.WriteLine(strategy.GetType().ToString());
strategy.ShowData(data);
}
public void Add(string name) {data.Add(name); }
}
}
StrategyExample.ShowAllDate
aaa
bbb
ccc
abc
StrategyExample.SearchData
aaa
abc
StrtegyExample.ShowPageData
ccc

abc
代码说明
Data类就是环境或者说上下文角色,持有对策略角色的引用。在这里,我们通过一个方法来设置环境使用

的策略,你也可以根据需求在构造方法中传入具体策略对象。
ShowDataStrategy抽象类就是抽象策略角色,它定义了策略共有的接口。
 ShowAllData、ShowPagedData以及SearchData类都是具体策略角色,它们实现真正的算法或行为。
 客户端在调用的时候才决定去使用哪种策略模式。
 可以看到,由于显示数据由各个具体策略类来实现,使得环境角色的复杂度降低了很多。并且如果以后还需
要增加新的显示数据方式的话只需要增加新的具体策略类(实现抽象策略接口)就可以了,环境类的代码不需要
做改动。对于各具体策略实现过程中可复用的部分也可以放在抽象策略类中实现。
何时采用
从代码角度来说, 如果一个类有多种行为,并且在类内部通过条件语句来实现不同的行为的时候可以把这

些行为单独封装为策略类。
 从应用角度来说,如果系统需要选择多种算法中的一种并且希望通过统一的接口来获取算法的输出的话可

以考虑策略模式。
实现要点
 在环境角色中拥有策略角色的实例。
 如果策略角色需要使用环境中的数据,一般可以让环境把数据传给所有策略角色,或者可以让环境把自身传
给策略角色,前者会带来不必要的通讯开销,后者会使环境和策略角色发生紧密耦合。根据需要选择合适的方式。
 环境角色可以在客户端没有提供策略角色的时候可以实现模式的策略。

注意事项
策略模式的缺点是客户端需要了解具体的策略,因此仅当客户端能做出这样选择的时候才去使用策略模式。
 过多的策略对象可能会增加系统负担,可以考虑把各种策略角色实现为无状态对象的享元,需要保存的额
外状态由环境角色进行统一管理和处理。

我觉得示例代码中的ShowDataStrategy应该作为接口,而不是抽象类虽然都可以实现策略模式
但是在示例中,我感觉应该是一种“can do”的方式,不是一种“is a”的方式。

貌似使用接口更好!
好像用“can do”的方式更恰当一点,不过无论怎么说,都非常感谢楼主的知识分享

相关文档
最新文档