C# 设计模式-策略者模式(Strategy)
2024-10-17 22:49:17
策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换。"
模式涉及到三个角色:
1、环境(Context)角色:持有一个Strategy类的引用。
2、抽象策略(ICommunication)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
3、具体策略(Serial、Lan)角色:包装了相关的算法或行为。
直接看例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers; namespace Demo
{
public interface ICommunication
{
bool Send(object data);
} public class Serial:ICommunication
{
public bool Send(object data)
{
Console.WriteLine("通过串口发送一个数据的算法");
return true;
}
} public class Lan:ICommunication
{
public bool Send(object data)
{
Console.WriteLine("通过网口发送一个数据的算法");
return true;
}
} public class Context
{
private ICommunication _communication;
public void SetStrategy(ICommunication communication)//传递具体的策略
{
this._communication = communication;
}
public bool Send(object data)
{
return this._communication.Send(data);
}
} class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入通信类型:Lan、Serial");
string input = Console.ReadLine();
object data = new object();
Context ct = new Context();
if (input.Equals("Lan")) //通过客户端的选择,来确定具体用哪种通信算法
{
ct.SetStrategy(new Lan());
}
else
{
ct.SetStrategy(new Serial());
}
ct.Send(data);
Console.ReadKey();
}
}
}
运行结果:
从上面的例子可以看出,Strategy与Factory模式很类似,但Factory在创建时改变对象,而Strategy模式可自由切换。
Strategy模式可用于封装较差却易于实现的解决方案,也可以封装较好却难以实现的解决方案。可首先实现较差却易于实现的解决方案,,然后用这个较差方案进行测试,利用该模式可在后期实现较好的方案,且不必更改调用算法的方案。
策略模式的缺点有:
1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
最新文章
- string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比
- Visual Studio 14 初试,vNext
- C# Form.Close 的释放问题
- 《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限
- VS2010编译链接openssl静态库
- QFile文件操作-QT
- Monkey学习(1)环境搭建
- 17.allegro导入导出[原创]
- 显示MYSQL数据库信息
- 通过编写一个简单的漏洞扫描程序学习Python基本语句
- JSP判断移动设备
- Android 不规则图像填充 小玩着色游戏
- Linux 用户关联命令
- [virtualbox] win10与centos共享目录下,nginx访问问题
- IOS内存约定-【ios】
- PTA寒假三
- Java:类的构造函数
- IE9获取file控件的本地文件路径
- golang error信息转字符串 x := fmt.Sprintf(";%s";, err)
- JAVA自动补全代码
热门文章
- 关于Java大数操作(BigInteger、BigDecimal)
- C++进阶--解谜operator new/delete
- What is SolrCloud? (And how does it compare to master-slave?)
- WINDOWS和linux下stdcall
- vue中滚动事件绑定的函数无法调用问题
- 【SQL Server】MS SQL Server中的CONVERT日期格式化大全
- 峰Redis学习(1)Redis简介和安装
- react中的数据请求
- Java-Runoob-高级教程-实例-方法:07. Java 实例 – instanceOf 关键字用法
- [C#][WebAPI]返回 json