您现在的位置是:网站首页> 内容页

设计模式学习---策略模式

  • 澳门百老汇登录中心
  • 2019-03-17
  • 289人已阅读
简介最近在看"HeadFirst设计模式"这本书便想将自己所学的记录下来以加深理解文中肯定有许多不足之处请各位前辈们指出.什么是设计模式设计模式并不是某种开发语言中的工具而是我们处理问

最近在看"Head First 设计模式"这本书便想将自己所学的记录下来以加深理解文中肯定有许多不足之处请各位前辈们指出.

什么是设计模式

设计模式并不是某种开发语言中的工具而是我们处理问题时的一种体现平时在工作我们也总是会使用设计模式在工作时我们会碰到各种问题然后我们通过思考总结.得到出自己的一套处理问题的经验或许我们并不知道什么是设计模式但是对于某种问题我们已经有了一套解决方案然后通过观看它人的代码会发现别人处理这类问题与自己总结的相同其实设计模式就是如此它是前辈们通过大量的经验总结了出了一套程序设计思想然后通过记录和分享于是出现了现在编程中的圣经-----23种设计模式.也就是说设计模式其实并不神秘但是它却如此的重要

:此处所说的问题是代码中设计的问题并不是功能需求问题例如代码的紧耦合

策略模式介绍

下面来说一下第一个设计模式:策略模式策略模式是一个极其简单的模式但也是一个极其常用的模式下面以一个极其简单的例子介绍策略模式现在要为一家商场设计一个促销功能不过现在并不知道具体的促销需求我们只需将促销需求设计出来然后在后期进行添加具体的促销策略于是我们快速的完成了这个类的第一版

// 商品类class Goods{ // 商品名称 public string GoodsName { get set } // 商品价格 public decimal GoodsPrice { get set } // 促销方法 public void Discount() { Console.WriteLine("这是促销方法目前无促销") }}

注:这是一个简单例子只为阐述策略模式.

这一个简单的类型便是第一版的商品类的促销功能但是在这里有一个巨大的问题就是促销策略的改变使得我们就必须更改其代码.这并符合我们的设计理念我们观察代码可以得知在这个功能中促销是一个可变的部分而我们可以将可变的部分进行分离现在我们来更改一下代码

// 商品类 class Goods { //促销类引用 public DiscountStrategyClass DiscountStrategyClass { get set } // 商品名称 public string GoodsName { get set } // 商品价格 public decimal GoodsPrice { get set } // 促销方法 public void Discount() { //调用促销类的促销方法 DiscountStrategyClass.Discount() //Console.WriteLine("这是促销方法目前无促销") } } // 促销类 class DiscountStrategyClass { // 促销方法 public void Discount() { Console.WriteLine("这是促销方法目前无促销") } }

上面就是我们将促销方法分离后的代码我创建了一个促销类然后在商品类内部创建一个促销类的引用并在促销方法调用促销类的促销方法然后我们其实很自然的就能想到下一步了也就是创建抽象促销类然后子类进行实现并约定好自己的促销策略而商品类只需声明并调用抽象促销类促销方法就可以

// 商品类 class Goods { //促销接口引用 public IDiscountStrategy DiscountStrategy { get set } // 商品名称 public string GoodsName { get set } // 商品价格 public decimal GoodsPrice { get set } // 促销方法 public void Discount() { //调用促销类的促销方法 DiscountStrategy.Discount() //Console.WriteLine("这是促销方法目前无促销") } } // 促销类 interface IDiscountStrategy { // 定义促销方法 void Discount() } //八折折扣 class EightyPercentDS : IDiscountStrategy { public void Discount() { Console.WriteLine("这是促销方法我打八折") } } //七折折扣 class SevenPercentDS : IDiscountStrategy { public void Discount() { Console.WriteLine("这是促销方法我打八折") } }

这个小的促销功能就完成了并且我们可以感觉到在写代码时总是这样使用从这里可以看到策略模式的两个好处

    可以在不改变当前结构下添加新的策略可以在运行时动态的改变策略

策略模式体现了两个原则:

    找出程序中可能需要变化的地方把它独立出来好让其它部分不会受到它的影响多用组合少用继承

其中策略模式强调的是组合也就是有一个(HAS-A)只是这里并没有很好的体现在装饰者模式更能很好的体现我们在设计编写代码时也要遵守这样的规则让系统变得更有弹性.

策略模式结构

UML

下面是这个简单的策略模式的UML图但在项目中有时候却会再抽象一层将环境角色类(当前Goods)抽象成抽象类也就是这样的UML图

这样的UML可以想象成将Goods类变成抽象类然后再声明它的子类例如ComputerGoods(电视)BookGoods(书籍)然后利用继承的特性来解放实现也就是我们常说的面对接口编程

注: 面对接口编程并不是面对Interface编程而是面对超类编程

策略模式定义

定义一个算法家族分别封装起来让它们可以互相替换此模式让算法的变化独立于使用算法的客户

1 0 9)

文章评论

Top