策略模式

策略模式示例 -- C#语言

丶灬走出姿态 提交于 2019-12-05 02:27:52
定义 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 UML图 代码 为了方便写到了一起,实际开发中类要单独页面写。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Pattern_Duck { class Program { static void Main(string[] args) { Duck mallard = new MallardDuck(); mallard.PerformFly(); mallard.PerformQuack(); mallard.Display(); Console.WriteLine("___________"); Duck model = new ModelDuck(); model.PerformFly(); model.SetIFlyBehavior(new FlyRocketPowered()); model.PerformFly(); Console.ReadKey(); } } //抽象基类:鸭子 public abstract class Duck { /

Python设计模式: 最佳的\"策略\"模式实践代码

こ雲淡風輕ζ 提交于 2019-12-04 23:47:38
Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下 流畅的python ,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅。 平时用Python来写爬虫比较多,所以最近一直在看设计模式的内容。刚好这本书里面有一章单独讲设计模式的,讲的还不错,特意摘录出来。 这段代码的需求背景是电商平台常用的促销策略: 用户的积分超过1000时,订单总价优惠5%的金额 购买商品的种类超过10种时,订单总价优惠7%的金额 单个商品购买数量超过20件时,该商品获得10%的折扣 具体代码如下: from collections import namedtuple Customer = namedtuple('Customer', 'name fidelity') class LineItem: def __init__(self, product, quantity, price): self.product = product self.quantity = quantity self.price = price def total(self): return self.price * self.quantity class Order: # the Context def __init__(self, customer, cart, promotion=None):

设计模式--策略模式

你。 提交于 2019-12-04 20:20:40
设计模式--策略模式 1、策略模式    策略模式: 定义一些列算法,把它们一个个的封装起来,并且使它们可以相互替换,该模式可以使得算法独立于使用它的客户而变化。 2、策略模式的结构 角色 策略: 策略是一个接口,该接口定义了若干算法,也即是若干的抽象方法; 上下文: 上下文是依赖于策略接口的类,即上下文包含策略声明的变量,上下提供一个方法,该方法委托策略变量调用具体策略所 具体策略: 具体策略是实现策略接口的类,它需要实现策略接口中定义的抽象方法。 类图 3、策略模式举例 策略接口:Strategy.java package com.nick.pattern.strategy; /** * 抽象策略接口:定义若干抽象方法 * @author nick */ public interface Strategy { public abstract void algorithm(); } 上下文:Context.java package com.nick.pattern.strategy; /** * 上下文类 * @author nick */ public class Context { Strategy strategy; //定义策略变量 public void setStrategy(Strategy strategy){ this.strategy=strategy; /

使用策略模式加标签来解决商品显示的一级分层

試著忘記壹切 提交于 2019-12-04 19:37:08
假设我们要在一个商品显示对象中放入商品对象的任何一个属性 商品显示类的定义如下 @Data public class ProductShow { private String title ; } 商品类的定义如下 @AllArgsConstructor @Data public class Product { private String name ; private BigDecimal amount ; private LocalDate date ; } 商品工厂类定义如下 public class ProductFactory { public static Product createProduct () { Product product = new Product( "football" ,new BigDecimal( "36.4" ) , LocalDate. now ()) ; return product ; } } 显示的枚举Tag定义如下 public enum Tag { Name , Amount , Date ; } 我们写一个管理类来打印商品显示类要显示商品的哪个属性 public class ProductManager { public static ProductShow showProduct (Tag tag) { Product

字符串与模式匹配算法(五):BMH算法

混江龙づ霸主 提交于 2019-12-04 19:08:22
一、BMH算法介绍    在BM算法的实际应用中,坏字符偏移函数的应用次数要远远超过好后缀偏移函数的应用次数,坏字符偏移函数在匹配过程中起着移动指针的主导作用。在实际匹配过程,只是用坏字符偏移函数也非常有效。1980年,奈杰尔·豪斯普(Nigel Horspool)提出了改进的BM算法,也就是BMH算法。简化了BM算法,执行非常方便,效率也很可观。Boyer-Moore算法使用两种策略来确定不匹配模式的位移:坏字符策略和高端策略。 来自Horspool的想法是仅使用坏字符策略,而不使用导致不匹配的字符,而始终使用文本窗口的正确字符。 二、主要思想    Horspool建议仅使用窗口最右边字符的坏字符移位来计算Boyer-Moore算法中的移位。 例如:    (a) Boyer-Moore 0 1 2 3 4 5 6 7 8 9 ... a b c a b d a a c b a b c a a b b c a a b   (b) Horspool 0 1 2 3 4 5 6 7 8 9 ... a b c a b d a a c b a b c a a b b c a a b   观察是上面两个不同算法的例子,后缀ab匹配,比较c-a表示不匹配。 Boyer-Moore算法(a)根据最后一次出现c的坏字符位置的策略确定滑动距离。 Horspool算法(b

设计模式——行为型模式之策略模式(二)

≡放荡痞女 提交于 2019-12-04 16:41:46
策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决: 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。 何时使用: 一个系统有许多许多类,而区分它们的只是他们直接的行为。 如何解决: 将这些算法封装成一个一个的类,任意地替换。 关键代码: 实现同一个接口。 应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式

设计模式之策略模式

ぃ、小莉子 提交于 2019-12-04 16:28:21
  针对Java语言,最主要的一个思想是面对对象设计(OOP)。在面向对象设计的开发过程中,需要用到各种设计模式,其中策略模式作为其中一个应用最为常见的模式之一,在生产过程中广泛应用。我们知道,在面向对象开发过程中,经常用到继承和多态,其与策略模式的基本思想是基本一致的。 在实际开发过程中,经常遇到的一种业务场景是 对于某一种行为采取不同的处理方法。比如说,对用户进行分级,针对不同级别的用户,进行不同的处理方式;再比如,针对同一个问题,进行多种不同的处理方式,对于多种处理方式进行比较。策略模式应运而生,策略模式是处理算法不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。策略模式把针对一个算法标识的一系列具体算法分别封装在不同的类中,使得各个类给出的具体算法可以相互替换。如下,是策略模式的结构图。 策略模式的角色 在策略模式中,存在三种角色,分别是策略(Strategy)、具体策略(ConcreteStrategy)和封装类(Context)。   1) 策略(Strategy):策略是一个接口,在这个接口中我们定义了很多的抽象方法。   2) 具体策略(ConcreteStrategy):具体策略是策略接口的实现类,在这个实现类中,我们对于其抽象方法进行了重写,可以定义多个具体策略。即在具体策略中

设计模式之原型模式、策略模式、观察者模式

折月煮酒 提交于 2019-12-04 14:56:08
一、原型模式 1、什么是原型模式 克隆 原型模式是一个创建型的模式。原型二字表明了改模式应该有一个样板实例,用户从这个样板对象中复制一个内部属性一致的对象,这个过程也就是我们称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。 2、原型模式应用场景 (1)类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。 (2)通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。 (3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。 Spring框架中的多例就是使用原型。 3、原型模式UML类图(通用) 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: (1)实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 (2

设计模式之原型模式、策略模式、观察者模式

こ雲淡風輕ζ 提交于 2019-12-04 14:46:41
一、原型模式 1、什么是原型模式 克隆 原型模式是一个创建型的模式。原型二字表明了改模式应该有一个样板实例,用户从这个样板对象中复制一个内部属性一致的对象,这个过程也就是我们称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。 2、原型模式应用场景 (1)类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。 (2)通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。 (3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。 Spring框架中的多例就是使用原型。 3、原型模式UML类图(通用) 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: (1)实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 (2

设计模式 策略模式

旧时模样 提交于 2019-12-04 13:02:56
策略模式:不同策略分开处理,避免出现大量 if...else 或者 switch...case class User { constructor(type) { this.type = type; } buy() { if (this.type === 'ordinary') { console.log('普通用户购买'); } else if (this.type === 'member') { console.log('会员用户购买'); } else if (this.type === 'vip') { console.log('vip 用户购买'); } } } // 测试 var u1 = new User('ordinary'); u1.buy(); var u2 = new User('ordinary'); u2.buy(); var u3 = new User('ordinary'); u3.buy(); 这里可能有大量的 if...else。功能肯定没有问题,设计模式的存在不是解决bug,是提高设计能力,提高拓展性的 class OrdinaryUser { buy() { console.log('普通用户购买'); } } class MemberUser { buy() { console.log('会员用户购买'); } } class VipUser