網站首頁 編程語言 正文
最近踢了場球,9人制比賽,上半場我們采用防守陣型效果不佳,下半場采用進攻陣型取得了比賽的主動。我們上下半場所采取的策略,似乎可以用"裝飾器"模式實現一遍。
首先肯定是抽象基類。
public abstract class OurStrategy
{
public abstract void Play(string msg);
}
通常,在上半場,我們一般都使用防守陣型。
public class OurDefaultStategy : OurStrategy
{
public override void Play(string msg)
{
Console.WriteLine("上半場4-1-2-1防守陣型");
}
}
下半場,會根據上半場的態勢而調整陣型。也就是需要實現OurStrategy這個抽象類。不過,先不急,我們還得先抽象出一個實現OurStrategy這個抽象類、充當裝飾器的一個抽象類。
public abstract class OurDecorator : OurStrategy
{
private OurStrategy _ourStrategy;
public OurDecorator(OurStrategy ourStrategy)
{
this._ourStrategy = ourStrategy;
}
public override void Play(string msg)
{
if (_ourStrategy != null)
{
_ourStrategy.Play(msg);
}
}
}
以上,這個充當裝飾器的抽象類,接收某個實現OurStrategy抽象基類的子類實例,并執行OurStrategy抽象基類的方法Play。
接下來,實現OurDecorator這個充當裝飾器的類。
public class AttackStategy : OurDecorator
{
public AttackStategy(OurStrategy ourStrategy) : base(ourStrategy)
{
}
public override void Play(string msg)
{
base.Play(msg);
Console.WriteLine("下半場3-1-3-1進攻陣型");
}
}
以上,當然還可以寫出很多OurDecorator的派生類。
客戶端這樣調用:
class Program
{
static void Main(string[] args)
{
OurDecorator ourDecorator = new AttackStategy(new OurDefaultStategy());
ourDecorator.Play("haha");
Console.ReadKey();
}
}
以上,
通過new AttackStategy(new OurDefaultStategy())把new OurDefaultStategy()實例賦值給類充當裝飾墻的抽象基類OurDecorator的_ourStrategy字段。
當執行ourDecorator.Play("haha")方法,首先來到AttackStategy的Play方法,執行base.Play(msg),這里的base就是AttackStategy的抽象父類OurDecorator,再執行OurDecorator的Play方法,由于已經給OurDecorator的_ourStrategy字段賦值,_ourStrategy字段存儲的是OurDefaultStategy實例,所以,base.Play(msg)最終執行的是OurDefaultStategy的Play方法,即把"上半場4-1-2-1防守陣型"顯示出來。
最后執行AttackStategy的Play方法中的Console.WriteLine("下半場3-1-3-1進攻陣型")部分,把"下半場3-1-3-1進攻陣型"顯示出來。
原文鏈接:https://www.cnblogs.com/darrenji/p/4398359.html
相關推薦
- 2022-11-05 Nginx配置文件nginx.conf的基本配置實例詳解_nginx
- 2022-09-25 2022react高頻面試題有哪些
- 2023-01-18 Python中的函數參數類型檢查_python
- 2022-06-19 LINQ基礎之Join和UNION子句_C#教程
- 2023-01-30 python多進程程序打包成exe的問題_python
- 2022-10-15 QT實現文件傳輸功能_C 語言
- 2023-01-13 Pytorch中的modle.train,model.eval,with?torch.no_grad
- 2022-08-01 MongoDB基礎之集合操作_MongoDB
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支