首页 > 其他分享 >设计模式——策略模式

设计模式——策略模式

时间:2022-12-19 14:07:33浏览次数:29  
标签:context 策略 void 模式 Strategy 算法 Context new 设计模式


一、定义

它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。

设计模式——策略模式_构造方法

二、特点

  1. 封装了变化
  2. 策略模式的Strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于析取出这些算法中的公共功能

三、优缺点

优点

  1. 简化了单元测试,每个算法都有自己的类,,可以通过自己的接口单独测试
  2. 减少了算法类和使用算法类之间的耦合,一个算法一个类

缺点

在基本的策略模式中,所具有具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

什么时候用

多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

五、实例

策略模式
Strategy类,定义所有支持的算法的公共接口

//抽象算法类
abstract class Strategy
{
//算法方法
public abstract void AlgorithmInterface();
}

ConcreteStrategy类:封装了具体的算法或行为,继承于Strategy

//具体算法A
class ConcreteStrategyA:Strategy
{
public override void AlgorithmInterface
{
Console.writeline("算法实现");
}
}

//具体算法B
class ConcreteStrategyB:Strategy
{
//算法吧B实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法B实现");
}
}

//具体算法C
class ConcreteStrategyC:Strategy
{
//算法C实现方法
public override void AlgorithmInterface()
{
console.writeline("算法C实现);
}
}

Context类:用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。

class Context
{
//初始化时,传入具体的策略对象
Strategy strategy;
public Context(Strategy strategy)
{
this.strategy=strategy;//
}

//上下文接口
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}

客户端代码

static void Main(string [] args)
//由于实例化不同的策略,所以最终在调用context.ContextInterface();时所获得的结果就不相同
//声明Context 类型变量
Context context;

context= new Context(new ConcreteStrategyA());
context.ContextInterface();

context= new Context(new ConcreteStrategyB());
context.ContextInterface();

context= new Context(new ConcreteStrategyA());
context.ContextInterface();

Console.Read();

类图关系代码表示

设计模式——策略模式_构造方法_02

六、涉及知识点

1.构造方法

对类进行初始化,
与类同名
无返回值,无void
与类同名,在new的时候使用
所有类都有构造方法,如果不编码则系统默认生成空的构造方法,若你有定义的构造方法那么默认的构造方法就会失效。

2.访问修饰符

public:公有的 表示所修饰的类成员可以允许其他任何类来访问
private:私有的 表示只能在同一个类的成员访问

3.关系

本模式中涉及到的关系

聚合:表示一种弱的拥有关系,整体和个体的关系,个体可以脱离整体单独存在
实现:成员变量,作为参数传入到整体的构造方法
图形:空心菱形+实线箭头
继承:类与类,类与接口之间的关系,。子类继承父类所有非private的方法
实现:子类继承父类用:表示
图形:空心三角形+实线

4.抽象类

用abstract关键字修饰

抽象类代表一个抽象的概念,他提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树叶节点均应是抽象类。

5.特点

  1. 抽象类不能实例化
  2. 抽象方法时必须被子类重写的
  3. 如果类中包含抽象方法,那么类必须定义为抽象类,不论是否还包含其他一般方法
  4. 一个类可以支持多个接口,一个类只能继承一个类。


标签:context,策略,void,模式,Strategy,算法,Context,new,设计模式
From: https://blog.51cto.com/u_15916106/5952243

相关文章

  • 设计模式——迭代器模式
    一、定义提供一种方法循序访问一个聚合对象中各个元素,而又不暴露该对象地内部表示和Foreachin功能相同Aggregate类:聚焦抽象类提供创建迭代器地方法ConcreteAggregatelei:......
  • 设计模式中的六种关系以及代码之间的对应
    强弱关系:依赖<关联<聚合<组合<实现<继承 一、依赖battle关联依赖定义对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之......
  • Atom 项目仓库正式归档,进入只读模式
    Atom项目仓库正式归档,进入只读模式来源:OSCHINA编辑: 局2022-12-1908:46:00 2GitHub正式归档了Atom项目的代码仓库,目前已进入只读模式。Atom是......
  • Spring Cloud 应用 Proxyless Mesh 模式探索与实践
    作者:十眠ServiceMesh简介ServiceMesh早已不是一个新兴的概念,目前已经有许多关于ServiceMesh的探索以及实践。2016年可以说是ServiceMesh的元年,Buoyant公司CEO......
  • Spring Cloud 应用 Proxyless Mesh 模式探索与实践
    作者:十眠ServiceMesh简介ServiceMesh早已不是一个新兴的概念,目前已经有许多关于ServiceMesh的探索以及实践。2016年可以说是ServiceMesh的元年,Buoyant公司......
  • 【RocketMQ】主从模式下的消费进度管理
    在【RocketMQ】消息的拉取一文中可知,消费者在启动的时候,会创建消息拉取API对象PullAPIWrapper,调用pullKernelImpl方法向Broker发送拉取消息的请求,那么在主从模式下消费者是......
  • 解释器模式
    四则运算问题传统方案解决四则运算问题分析   解释器模式基本介绍解释器模式的原理类图   对原理类图的说明-即(解释器模式的角色及职责)解释器模式来......
  • 单例模式
    单例模式单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。单例设计模式八种方......
  • C#设计模式之策略模式
    原文链接:https://www.jb51.net/article/239469.htm策略模式所谓策略其实就是做一件事情有很多很多的方法。比如说一个商场要搞促销,促销的方式有可能有很多:打折啊,满100返......
  • 模板方法设计模式
    模板方法设计模式在之前的oa项目中,web.xml是一个臃肿的问题,使用注解开发可以有效解决还有一个比较臃肿的问题,一个servlet单表crud就对应了6个servlet类,这种开发方式,......