策略模式

设计模式之策略模式

五迷三道 提交于 2020-03-05 05:30:42
注解:策略模式主要以抽象为主,事实上所有的设计模式都是以抽象为主要目的。策略模式只是设计模式中最简单的一种。 要点:抽取容易发生变化的部分把这些可能会随着日后需求改变的"一组行为"抽取出来,变成"一族算法"。 总结:1.多用包含,少用继承(解除继承所代来的单一性) 。 2.抽取可能会发生变化的部分,既使在项目初期所能预料到的变化很少。 3.面向父类或接口编程。 项目结构如下图: 我只给出了几个类的代码,其它类的都类似,领悟精神,主要以思想为主。 角色的父类 角色父类 1 namespace 策略模式.Role 2 { 3 /**/ /// <summary> 4 /// 角色 5 /// </summary> 6 public abstract class Role 7 { 8 public Weapons.IWeapon Weapon { get ; set ; } 9 10 /**/ /// <summary> 11 /// 攻击方法 12 /// </summary> 13 public abstract void Attack(); 14 } 15 } 子类1 女王 子类1(女王) 1 using System; 2 3 namespace 策略模式.Role 4 { 5 /**/ /// <summary> 6 /// 女王 7 /// </summary> 8

Python设计模式之策略模式

南笙酒味 提交于 2020-03-02 21:16:24
Python 中的设计模式详解之:策略模式 虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。 《设计模式:可复用面向对象软件的基础》一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”。 1、策略模式概述 策略模式 :定义一系列算法,把它们一一封装起来,并且使它们之间可以相互替换。此模式让算法的变化不会影响到使用算法的客户。 电商领域有个使用“策略”模式的经典案例,即根据客户的属性或订单中的商品计算折扣。 假如一个网店制定了下述折扣规则。 有 1000 或以上积分的顾客,每个订单享 5% 折扣。 同一订单中,单个商品的数量达到 20 个或以上,享 10% 折扣。 订单中的不同商品达到 10 个或以上,享 7% 折扣。 简单起见,我们假定一个订单一次只能享用一个折扣。 UML类图如下: Promotion 抽象类提供了不同算法的公共接口,fidelityPromo、BulkPromo 和 LargeOrderPromo 三个子类实现具体的“策略”,具体策略由上下文类的客户选择。 在这个示例中,实例化订单(Order 类)之前,系统会以某种方式选择一种促销折扣策略,然后把它传给 Order 构造方法。具体怎么选择策略,不在这个模式的职责范围内。(选择策略可以使用工厂模式。) 2、传统方法实现策略模式: from abc import ABC

策略模式

末鹿安然 提交于 2020-03-02 20:04:24
什么是策略模式? 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方法调用所有的的算法,减少了各种算法类与使用算法类之间的耦合。 策略模式优化了简单的单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。 什么时候使用策略模式? 当不同的行为堆砌在一个类中时,就很难使用条件语句来选择合适的行为。将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。 策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析的过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。 来源: https://www.cnblogs.com/yangqizhong/archive/2010/04/01/1702347.html

num02---策略模式

帅比萌擦擦* 提交于 2020-03-01 13:12:05
只听名字总没有什么头绪,什么策略? 情景: 超市活动,有满减,有打折,有正常收费,求 不同情况下的付款额。 ①创建 付款基类抽象类,有一个抽象方法apply用于计算活动后实际付款额 //付款 基类 public abstract class CashSuper {   //计算付款额   public abstract double apply(double money); } ② 创建正常付费、打折付费、满减付费 三种付费方式类,分别继承付费基类。各自重写自己的apply方法。 // 满A返现(B) 方式 public class CashReturn extends CashSuper {   private double A;   private double B;   public CashReturn(String a, String b) {     super();     A = Double.valueOf(a.toString());     B = Double.valueOf(b.toString());   }   @Override   public double apply(double money) {     if(money >= A){       return money - B;     }else{       return money;

设计模式之策略模式

做~自己de王妃 提交于 2020-02-29 13:56:26
一、策略模式的概念 策略模式是一种行为模式,它通过对一系列的算法(或者行为)加以封装,并为这些算法(或者行为)定义统一的抽象算法(或者行为)接口, 具体子类继承该抽象算法(或者行为)接口对所有的算法(或者行为)加以封装和实现,调用者去自由的选择使用哪个算法(或者行为)。 二、策略模式使用场景 1、一个系统需要动态地在几种算法(或者行为)中选择一种时,可以使用策略模式。 2、当一个对象有很多的行为,为避免使用过多的条件判断语句,可以使用策略模式来实现。 三、策略模式构建方法 1、策略抽象类(Strategy) 策略抽象类给策略具体类提供统一的共同接口和方法。 2、策略具体类(ConcreteStrategy) 策略具体类继承策略抽象类,用于实现策略抽象父类中的共同接口和方法。 3、策略的容器类(Context) 策略的外部封装类, 根据不同的策略执行不同的行为。 四、策略模式的示例 // StrategyPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // # include <iostream> # include <string> using namespace std ; # define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}} // 策略算法基类 class

聊聊基于数据库的策略模式

孤人 提交于 2020-02-28 13:36:35
策略模式概述: 在我看来最主要的是使用策略的代码是固定的,但策略是可以自由选择的。这就使得对策略的选择和使用进行了解耦。 策略模式: https://blog.csdn.net/weixin_37968613/article/details/103068487 基于数据库进行对策略进行选择: 举个例子: 我们现在有一个场景,业务中需要用到很多配置码表信息(上百张配置表),诸如:goodsCode,商品名称goodsName,大部分配置表都是code,name的形式,但也会有bussinessId,XXId等其他更多字段。在这种情况下,如果我们要自由获取到每张配置表的信息,我们会怎么做? 为每一张写一个查询吗?显然是太难以扩展了,那样增加删除配置表都需要修改代码。 这里有一种思路,采用一张 全局配置表 存储着 每张配置表 的信息,如码表类型Type,表名,code字段名称(goodsCode),name字段名称(goodsName)等, 首先根据我们要查的码表类型codeType,到全局配置表查出我们要查的表名,字段名称,采用策略等 ,然后 再去相应码表查出我们需要的值 。 一般的码表我们采用默认策略,另外针对一些特殊的,字段很多或不规则的码表,我们可以自己再实现一套策略去解决。 全局配置表中的策略字段, 可以存策略具体实现类(ConcreteStrategy)的Id

装饰者模式与代理模式的差异

柔情痞子 提交于 2020-02-28 10:59:04
前言 在还没毕业的去面试的时候,被问到动态代理与策略模式有什么区别,当时想了想也没想出来什么合适的回答,最会草草越过,之后面试完毕进行了相关的查阅,还是懵懵懂懂的,到现在debug SpringMVC源码的时候,遇到 initHandlerAdapters 初始化的后,一直纠结此处是使用了责任链模式还是策略模式,然后就想到了之前遇到的动态代理和装饰者模式。 来源: oschina 链接: https://my.oschina.net/u/2555967/blog/3156190

Android SELinux开发入门指南之SELinux基础知识

我们两清 提交于 2020-02-28 07:02:51
   Android SELinux开发入门指南之SELinux基础知识 前言    SEAndroid是在Android系统中基于SELinux推出的强制访问控制模型,来完善自主访问模型中只要取得root权限就可以为所欲为的情况。 SELinux是一种基于域-类型(domain-type)模型的强制访问控制(MAC)安全系统,其原则是任何进程想在SELinux系统中干任何事,都必须先在安全策略的配置文件中赋予权限。凡是没有在安全策略中配置的权限,进程就没有该项操作的权限。在SELinux出现之前,Linux的安全模型是DAC(DiscretionaryAccess Control),译为自主访问控制。其核心思想是进程理论上所拥有的权限与运行它的用户权限相同。比如,以root用户启动shell,那么shell就有root用户的权限,在Linux系统上能干任何事。这种管理显然比较松散。在SELinux中,如果需要访问资源,系统会先进行DAC检查,不通过则访问失败,然后再进行MAC权限检查。 一. SELinux基础知识 SELinux涉及的基本知识比较多,下面让我们来一一细说。 1.1 SELinux的三种模式 SELinux分为三种模式,下面我们看看究竟是那三种模式: Disable模式 此种模式关闭SELinux检测,不进行任何SELinux权限检查,畅通无阻。

python理解策略模式

主宰稳场 提交于 2020-02-27 15:53:07
策略模式使用场景:会有很多子类,并且需要动态更改行为是使用,动态更改行为就是使用不同子类的方法; 1、假如有一款游戏,角色有不同的攻击模式,并且由于业务的需求,可能会再继续添加多种攻击模式,在游戏运行的过程中也需要在不同攻击模式中切换; class Attack : def shoot ( self ) : pass class Jinzhan ( Attack ) : def shoot ( self ) : print ( '近战...' ) class Yuancheng ( Attack ) : def shoot ( self ) : print ( '远程攻击...' ) class Role : def __init__ ( self , attack = None ) : self . attack = attack def set_attack ( self , attack ) : self . attack = attack def gogogo ( self ) : self . attack . shoot ( ) if __name__ == '__main__' : role = Role ( ) role . set_attack ( Jinzhan ( ) ) role . gogogo ( ) role . set_attack (

js设计模式-策略模式

房东的猫 提交于 2020-02-26 10:37:19
在网上找了不少入门实例,依旧认为还是张容铭小哥给的情景最为适合,他的情境是这样的: 项目经理过来说,咱马上要过圣诞节啦,得打折清仓呀,有的商品5折,有的7折,有的9折~ 作为菜鸟的我🤔: 就这么尴尬的一个一个function垒起来~(在下刚入行的时候还真是这么写的😅~)。这时项目经理又来了,圣诞都打折了,元旦也表示一下儿呗,咱们来个满减吧~vip能满100减50,普通用户满100减30... 哪儿说理去,这需求说加就加,项目说改就改,没辙,谁让人家能带着我挣钱呢。不过我依旧固执的认为一个优秀的开发,是能够通过自己的代码设计来承受住需求业务的各种变化的~所以在下经过了一番修炼之后,将策略模式融合了进去,把代码美化了一番。 现在照着张小哥的小白书把代码改好了,如果各位客爷了解状态模式或者看过在下的另一篇 介绍状态模式的博文 的话,一定会对这个结构有点眼熟的,其实他也是由两个部分组成,分别是“策略类”和“环境类(环境方法)”。 上面这个例子中: 策略类 是指strategy对象,他可以保存所有的 策略名对应的算法 。 环境类 是用来调用传入要调用的策略名称和需要的参数,这个调用函数的地方我把书中的原文做了一点修改,原文中是在调用的时候只传了price作为参数 《js设计模式》书中原文 但这也既定了环境类只能摄入一个price价格参数,如果从设计的拓展性来考虑的话