`

StrategyPattern

阅读更多

策略模式(Strategy Pattern) 中体现了两个非常基本的面向对象设计原则


1.封装变化概念.
2.编程中使用接口,而不是对接口实现.换句话说就是面向接口编程.

 

策略模式的定义

 

1.定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换.

2.StrategyPattern使这些算法在客户端调用它们的时候能够互不影响变化.

比如:完成某件事情的方法有多种,这多种方法都可以完成这件事情,假设我想去
机场,那么去机场有多种方式:打车去,坐公交车去,开车去,骑车去等等.这几种
方式都可以实现我的目的,但是它们具体的实现方式是不一样的,但是它们的目的
是一样的.将这些不一样的东西叫做一组算法,它们可以互相交换达到同样的目的.

 

策略模式的意义


1.策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之
间是弱连接的关系也就是高内聚,低耦合:(模块内部它们是互相关联的,它们要达到高内聚,
就是说联系的非常紧密,但是模块与模块之间它们是达到低耦合,它们的关联不是那么
强)

 

2.弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软
件的可重用性.

 

策略模式的组成

 

抽象策略角色:策略类,通常由一个接口或者抽象类实现

具体策略角色:包装了相关算法和行为

环境角色:持有一个策略类(抽象策略角色)的引用,最终给客户端调用.也就是说客户端
使用的是环境角色但是环境角色中有个抽象策略角色的一个引用,这样在客户端使用的
时候我就可以去替换,相应的具体策略角色.

 

策略模式的实现


1.策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而
使得他们可以互相替换.
2.策略模式使得算法可以再不影响到客户端的情况下发生变化.使用策略模式可以把行为
和环境分割开来.
3.环境类负责维持和查询行为类,各种算法则在具体策略模式中提供.由于算法和环境独立
开来,算法的修改都不会影响环境和客户端.

 

策略模式的缺点


1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类.
2.造成很多的策略类.
克服这个缺点---->采用工厂方法

 

ClassDiagrm:

 

SequenceDiagrm:

 

class Client
    {
        static void Main(string[] args)
        {
            Context context = new Context();

            context.Add(10);
            context.Add(7);
            context.Add(-3);
            context.Add(9);

            context.Strategy = new QuickSortStrateqy();

            context.Sort();

            context.Display();

            context.Strategy = new BubbleSortStrategy();

            context.Sort();

            context.Display();

            Console.ReadKey();
        }
    }

    /// <summary>
    /// 环境角色
    /// </summary>
    public class Context
    {
        List<int> list = new List<int>();

        Strategy strategy;

        public Strategy Strategy
        {
            set
            {
                strategy = value;
            }
            get
            {
                return strategy;
            }
        }

        public void Add(int i)
        {
            list.Add(i);
        }

        public void Sort()
        {
            strategy.Sort(list);
        }

        public void Display()
        {
            foreach (int i in list)
            {
                Console.WriteLine(i);
            }
        }
    }

    /// <summary>
    /// 抽象策略角色
    /// </summary>
    public interface Strategy
    {
        void Sort(List<int> list);
    }

    /// <summary>
    /// 具体策略角色
    /// </summary>
    public class QuickSortStrateqy : Strategy
    {
        public void Sort(List<int> list)
        {
            //Sort()方法内部使用快速排序
            list.Sort();
        }
    }

    /// <summary>
    /// 具体策略角色
    /// </summary>
    public class BubbleSortStrategy : Strategy
    {
        /*冒泡排序有个特点当某一轮比较完之后,如果没有一个元素位置发生变化,
        表示排序实际上已经结束了.因此在排序的时候我们应该设置一个bool值
        看看元素有没发生交换.*/

        public void Sort(List<int> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
	bool flag = false;
                for (int j = 0; j < list.Count - 1 - i; j++)
                {
                    if (list[j] > list[j + 1])
                    {
                        list[j] = list[j] + list[j + 1];
                        list[j + 1] = list[j] - list[j + 1];
                        list[j] = list[j] - list[j + 1];
                        flag = true;
                    }
                }
                if (!flag)
                {
                    break;
                }
            }
        }
    }

 

  • 大小: 50.7 KB
  • 大小: 63.6 KB
分享到:
评论

相关推荐

    策略模式StrategyPattern

    策略模式StrategyPattern,通过实现鸭子的飞行策略以及叫声策略演示策略模式的具体实现!

    02_StrategyPattern 商场促销

    《商场促销:深入理解策略模式》 在软件设计中,策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在这个例子中,我们关注的是商场促销活动,这是一个经常需要根据具体情况调整策略的场景。...

    设计模式--策略模式StrategyPattern

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择具体...

    strategyPattern:软件设计

    在`strategyPattern-master`这个压缩包中,可能包含了以下内容: - `StrategyInterface.java`: 策略接口定义 - `ConcreteStrategyA.java`, `ConcreteStrategyB.java`, ...: 具体策略类实现 - `Context.java`: 客户端...

    实验四StrategyPattern

    利用策略模式在排序对象中封装不同的排序算法(包括冒泡排序、快速排序、合并排序等),用户输入一系列的数据,或从文件中读入所需数据, 输入数据类型的存储可结合泛型编程, 然后允许客户动态地选择上述某一种排序...

    [行为型模式] 策略模式的理解

    在`StrategyPattern.cpp`和`StrategyPattern.h`文件中,我们可以预期看到如下结构: `StrategyPattern.h`可能包含了策略接口的定义,例如: ```cpp // 策略接口 class Strategy { public: virtual ~Strategy() {} ...

    design pattern

    在给定的压缩包文件中,包含了九种经典的设计模式示例,它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式...

    Java设计模式学习教程与案例源码.zip

    1. [策略模式](worthed/OriginBlog/blob/master/articles/StrategyPattern.md) 2. [模板方法](worthed/OriginBlog/blob/master/articles/TemplateMethodPattern.md) 3. [状态模式](worthed/OriginBlog/blob/master...

    java设计模式示例,demo

    `StrategyPattern.java`可能包含了一个策略接口和多个实现了不同策略的类。 10. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。`ProxyDemo.java`可能展示了如何创建代理对象以控制原对象的...

    开发设计模式

    1. 策略模式【StrategyPattern】:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响到使用算法的客户端。在策略模式中,策略通常由接口定义,并由不同的具体策略类实现。客户端...

    Java策略者模式

    在提供的压缩包"StrategyPattern-Sample"中,我们可以预期找到以下几个关键部分: 1. **策略接口(Strategy Interface)**:例如命名为`AlgorithmInterface`,它声明了所有策略类必须实现的操作。例如: ```java ...

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,我们经常遇到需要在...在压缩包文件`strategyPattern`中,可能包含了示例代码或者进一步的解释材料,帮助读者更好地理解和应用策略模式。

    实验4、行为型模式应用实验(1)

    public class StrategyPattern { public static void main(String[] args) { Context c = new Context(); Strategy s = new ConcreteStrategyA(); c.setStrategy(s); c.strategyMethod(); // 其他策略类的...

    Desiger.rar

    在`StrategyPattern`目录下,可能存在`Context`、`Strategy`接口和若干个实现了`Strategy`接口的策略类,如`ConcreteStrategyA`、`ConcreteStrategyB`。 7. **建造者模式**:将复杂对象的构建与其表示分离,使得...

    objectivec 编程之道-设计模式源码下载

    源码可能在`StrategyPattern`下。 7. **职责链模式**:让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。在iOS中,错误处理系统或事件传递机制可以采用此模式。源码可能位于`...

    西北工业大学软件学院面向对象设计与编程课程的回忆和复习提纲

    设计模式,如单一实例模式(SingletonPattern)和策略模式(StrategyPattern),是在软件开发中针对特定问题的通用解决方案。 Java I/O(输入/输出)是处理数据存储和检索的机制。Java I/O流可以分为字节流和字符流...

    收集的电子书

    8. 策略模式(StrategyPattern): - 是一种行为设计模式,允许将算法的定义、创建和调用封装起来,使它们可相互替换,提高算法的灵活性和可重用性。 - 策略模式通常涉及到策略接口和具体策略实现类。 9. TreeMap...

    DesignPattern.zip

    `StrategyPattern`目录可能包含了策略接口和具体的策略类。 6. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。在C++中,代理模式可以使用智能指针和虚函数来实现。`ProxyPattern`目录可能...

Global site tag (gtag.js) - Google Analytics