Head First 设计模式----StrategyPattern

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

Interface

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StrategyPattern.Interface
{
    public interface FlyBehavior
    {
        void fly();
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StrategyPattern.Interface
{
    public interface QuackBehavior
    {
        void quack();
    }
}

Behavior

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Interface;

namespace StrategyPattern.Behavior
{
    //实现了所有不会飞鸭子的动作
    public class FlyNoWay:FlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("I can‘t fly");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Interface;

namespace StrategyPattern.Behavior
{
    //利用火箭动力的飞行行为
    public class FlyRocketPowered:FlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("I‘m flying with a rocket!");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Interface;
namespace StrategyPattern.Behavior
{
    //实现了所有有翅膀鸭子的飞行动作
    public class FlyWithWings:FlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("I‘m flying!");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Interface;
namespace StrategyPattern.Behavior
{
    //名为呱呱叫,其实不出声
    public class MuteQuack:QuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("<< Silence >>");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Interface;
namespace StrategyPattern.Behavior
{
    //呱呱叫
    public class Quack:QuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("Quack");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Interface;
namespace StrategyPattern.Behavior
{
    //名为呱呱叫,实为吱吱叫
    public class Squeak:QuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("Squeak");
        }
    }
}

使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Interface;

namespace StrategyPattern
{
    public abstract class Duck
    {
        protected FlyBehavior flyBehavior;
        protected QuackBehavior quackBehavior;

        public abstract void display();

        public void performFly()
        {
            flyBehavior.fly();
        }
        public void performQuack()
        {
            quackBehavior.quack();
        }
        public void swim()
        {
            Console.WriteLine("All ducks float, even decoys!");
        }

        public void setFlyBehavior(FlyBehavior fb)
        {
            flyBehavior = fb;
        }
        public void setQuackBehavior(QuackBehavior qb)
        {
            quackBehavior = qb;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Behavior;

namespace StrategyPattern
{
    //绿头鸭(一种野鸭)
    public class MallardDuck:Duck
    {
        public MallardDuck()
        {
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }
        public override void display()
        {
            Console.WriteLine("I‘m a real Mallard duck");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StrategyPattern.Behavior;
namespace StrategyPattern
{
    //模型鸭
    public class ModelDuck:Duck
    {
        public ModelDuck()
        {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Quack();
        }
        public override void display()
        {
            Console.WriteLine("I‘m a model duck");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StrategyPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Test Mallard Duck");
            Duck mallard = new MallardDuck();
            mallard.performFly();
            mallard.performQuack();

            Console.WriteLine("Test Model Duck");
            Duck model = new ModelDuck();
            model.performFly();
            model.setFlyBehavior(new StrategyPattern.Behavior.FlyRocketPowered());
            model.performFly();

            //Stop
            Console.ReadLine();
        }
    }
}
时间: 2024-08-03 08:13:56

Head First 设计模式----StrategyPattern的相关文章

设计模式学习一:strategyPattern

#ifndef STRATEGYPATTERN_H_#define STRATEGYPATTERN_H_#include<iostream>using namespace std; //策略接口class IStrategy{public: IStrategy(void){}; virtual ~IStrategy(void){}; virtual void Operate(void)=0;}; //策略一 class CBackDoor:public IStrategy{public: CB

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

Strategy模式是一种行为型设计模式,它将算法一个个封装起来,在某一时刻能够互换地使用其中的一个算法.从概念上看,所有这些算法完成的都是相同的工作,只是实现不同而已. 动机 在开发中,我们常常会遇到概念上相同,处理方法不同的任务,例如,对一件商品使用不同的税额计算方法来计算其价格.一般来说,有以下的方法来处理: 复制和粘贴(一份代码具有两个版本,维护成本大) 使用switch或者if语句,用一个变量指定各种情况(分支会变得越来越长) 函数指针或者委托(无法维持对象的状态) 继承(需求变化时,

接口的常用用法都有什么?策略设计模式复习总结

从之前的一个总结性话题引出: 从接口.抽象类到工厂模式再到JVM来总结一些问题 涉及的知识点总结如下: 策略模式概念和例子 工厂模式和策略模式比较 策略模式优缺点 策略模式的意义 使用了策略模式的API——HttpServlet类分析 解决策略膨胀问题——享元模式 StrategyPattern:策略模式也算比较简单的,同工厂模式一样都属于面向接口编程……策略模式是对象的行为模式之一,而工厂模式是对象的创建模式!它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口

(四)设计模式之PHP项目应用(策略模式:自动驾驶系统)

1 前言 关于策略模式的定义,模式组成,模式核心思想,模式架构图,程序架构等基础知识介绍.请先参考我的另外一篇博客<(三)设计模式之PHP项目应用(策略模式:商场收银系统)>:http://blog.csdn.net/clevercode/article/details/45722661. 2 项目应用 2.1 需求说明 某公司是福特和本田公司的金牌合作伙伴,现要求开发一套自动驾驶系统,只要汽车上安装该系统就可以实现无人驾驶,只用实现启动,转弯,停止功能即可.该系统可以在福特和本田车上使用.这

设计模式之策略模式20170720

行为型设计模式之策略模式: 一.含义 策略模式是一种比较简单的模式,也叫做政策模式,其定义如下: 定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二.代码说明 1.主要有两个角色 1)Context封装角色 它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化. 2)策略角色 该类含有具体的算法 2.在用C实现过程中也是参考这种思想,以压缩,解压算法举例,具体实现如下: 1)策略模式使用场景

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

一.什么是策略模式(Strategy Pattern)? 从字面上理解,策略模式就是应用了某种“策略”的设计模式,而这个“策略”就是:把变化的部分封装起来. 二.举个例子 假定现在我们需要用类来描述Dog 首先,所有的Dog都有外形(比如Color),有行为(比如Run.Bark) 于是我们很自然地定义了这样一个基类Dog: public abstract class Dog { public abstract void display();//显示Dog的外形 public abstract

Head First 之 Design Pattern(一):Strategy Pattern &amp;&amp; 初入设计模式殿堂

头一回阅读<Head First 设计模式>,感觉语言生动形象,把一个个抽象的模式描述的浅显易懂,就像白话文一样. 正如作者推荐如何使用这本书. 你懂Java吗(不太懂... 会C++不影响吧)? 你想学习.了解.记得并应用设计模式,以及其所基于的OO设计原则吗(是的,我正在深入学习C++呢)? 你是不是更喜欢一种轻松愉悦的学习环境(absolutely)? 这本书正是我需要的~   "Head First"就是那些不断学习的人们,像他们致敬,共勉加油~ 使用设计模式最好的

iOS设计模式 - 策略

效果 说明 1. 把解决相同问题的算法抽象成策略(相同问题指的是输入参数相同,但根据算法不同输出参数会有差异) 2. 策略被封装在对象之中(是对象内容的一部分),策略改变的是对象的内容.如果从外部扩展了对象的行为,就不叫策略模式,而是装饰模式. 3. 策略模式可以简化复杂的判断逻辑(if - else) 4. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解. 源码 https://github.com/YouXianMing/StrategyPattern // // I

(三)设计模式之PHP项目应用(策略模式:商场收银系统)

1 策略模式简介 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 2 模式组成 1)抽象策略角色(Strategy): 策略类,通常由一个接口或者抽象类实现. 2)具体策略角色(ConcreteStrategy): 包装了相关的算法和行为. 3)环境角色(Context): 持有一个策略类的引用,最终给客户端调用. 3 模式核心思想 策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是