zoukankan      html  css  js  c++  java
  • 设计模式

    简介

    场景

    某个功能需要从多种算法中根据条件选择一种时,有两个方案:

    • 将所有算法硬编码到代码中,然后通过条件语句进行选择
    • 使用策略模式使系统可以灵活地选择算法,并可以灵活添加新算法

    如果条件是固定的,比如根据星期几来选择算法,则可以通过条件语句硬编码。但是如果条件可能增加,可以使用策略模式。

    模式定义

    定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。

    每个封装不同算法的类称为策略(Strategy)类。

    模式特点

    策略模式包含三个角色:

    • Context:环境类
    • Strategy:抽象策略类
    • ConcreteStrategy:具体策略类

    这里写图片描述

    优缺点

    • 策略模式将算法的定义和使用分离,符合开放封闭原则,易于扩展
    • 调用者可以自己决定使用哪个算法,灵活性提供的同时,使用难度也增大

    PHP 代码示例

    对于国际贸易,结算时,每个国家的税费计算方法都不同:

    <?php
    
    abstract class TaxStrategy
    {
        abstract public function calculate(array $arr);
    }
    
    class CNTax extends TaxStrategy
    {
        public function calculate(array $arr)
        {
            return 0.1 * $arr['fee'];
        }
    }
    class FRTax extends TaxStrategy
    {
        public function calculate(array $arr)
        {
            return 0.2 * $arr['fee'];
        }
    }
    
    class SalesOrder
    {
        private $taxStrategy;
    
        public function __construct(TaxStrategy $s) {
            $this->taxStrategy = $s;
        }
    
        public function calcTax() {
            $context = array(
                'fee' => 100,
            );
            $val = $this->taxStrategy->calculate($context); // 多态调用
            echo $val.PHP_EOL;
        }
    }
    
    $cn = new CNTax();
    $so = new SalesOrder($cn);
    $so->calcTax();
    
    $fr = new FRTax();
    $so = new SalesOrder($fr);
    $so->calcTax();
  • 相关阅读:
    第 9 章 用户自己建立数据类型
    第 10 章 对文件的输入输出
    第 7 章 用函数实现模块化程序设计
    第 4 章 选择结构程序设计
    第 5 章 循环结构程序设计
    第 6 章 利用数组处理批量数据
    第 3 章 最简单的 C 程序设计——顺序程序设计
    第 1 章 程序设计和 C 语言
    第 2 章 算法——程序的灵魂
    SQL(SQL Server) 批量替换两列的数据
  • 原文地址:https://www.cnblogs.com/kika/p/10851574.html
Copyright © 2011-2022 走看看