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

最近在看"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("这是促销方法,我打八折");
        }
    }

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

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

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

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

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

策略模式结构

UML

下面是这个简单的策略模式的UML图

但在项目中有时候却会再抽象一层,将环境角色类(当前Goods)抽象成抽象类也就是这样的UML图

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

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

策略模式定义

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Vamei实验室

Python快速教程 尾声

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

1302
来自专栏PPV课数据科学社区

Eric Raymond 对于几大开发语言的评价

来源:孟岩 英文:Eric Raymond 链接:blog.csdn.net/myan/article/details/1923 【译注】:Eric Raym...

3566
来自专栏GopherCoder

『No24: 编写可读代码的艺术(1)』

除了本职工作,还有点幻灯片演示设计的爱好。随着编写代码的增多,制作的的幻灯片越来越多,越来越意识到,很多事物都存在相通性。

952
来自专栏python小白到大牛

一行代码结果叹为观止,能做到这么极致的也只有python了

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Pyt...

1473
来自专栏数据结构与算法

BZOJ4868: [Shoi2017]期末考试

Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布。第i位同学希望在第ti天 或之前得知所.有.课程的成绩。...

3506
来自专栏程序员的知识天地

从C++到Python,一个游戏程序员的进阶之路

我的第一份工作是一加国内知名游戏公司的逻辑程序员,必须技能是C++,但是一开始只是写语法和C++很类似的一种脚本(后来知道是从一个开源脚本引擎AngelScri...

1411
来自专栏PPV课数据科学社区

对5种主流编程语言的吐槽

接下来要为大家,介绍五款让我又爱又恨的编程语言! 不可否认,想要成为一名优秀的程序员确实是需要掌握多种编程语言。通过这几年的自虐式学习,我也慢慢的掌握了这些编程...

50810
来自专栏牛客网

趋势科技、美团、小米、网易互娱 C++后台开发offer面经

前言 经过六月到九月这几个月的努力,九风有幸拿到了趋势科技、小米、美团、网易互娱的offer,之前看了好多分享的面经,是时候该回馈了一波。 先介绍下九风的基本情...

5367
来自专栏咸鱼不闲

聊天机器人与Alice的AIML

聊天机器人从20世纪80年代起相继出现:TalkBot、Elbot、eLise、Alice、Laylahbot、爱情玩偶等,其中Alice曾被认为是最聪明的机器...

2717
来自专栏余林丰

桥接模式

桥接模式要把握的很重要的一点就是:类的继承关系和类的组合/聚合关系,何时应该考虑使用何种关系。是不是在编程过程中一味地使用类的继承关系就代表这就是面向对象编程了...

2177

扫码关注云+社区

领取腾讯云代金券