首页 > 其他分享 >策略模式和职责链模式实现坦克大战

策略模式和职责链模式实现坦克大战

时间:2025-01-21 17:02:51浏览次数:3  
标签:Tank 职责 void 模式 大战 class new create public

目录:一个实例讲完23种设计模式

当前:策略模式 职责链 观察者

上一篇 《命令模式坦克大战简单实现(java实现)

需求:坦克大战

创建两种坦克

坦克类型射程速度
b7070米时/70公里
b5050米时/70公里

简单说明一下

这任然用坦克大战的需求,实现了如下3种模式

  1. 策略
  2. 职责链
  3. 观察者(这里的观察者就一个,没有体现被观察者和观察者1对多的关系,但是观察者的价值在于被观察者发现自己有变化的时候,对观察者自动的通知,至于多少个观察者个人认为不是重点)
  4. 其实也用到了命令模式(因为将机能都封装成了对象,但我在类图中没画)
  5. 这篇文章的主要意图:策略+职责链的运用
  6. 我尽量都用坦克大战实现所有的模式就是希望对需求的理解别影响对模式的学习。(理解需求消耗的时间尽可能的少)

类图

代码

js实现

c++实现

jav实现

//--接口层----------------------------------------
//机能运行类
class Function{
	public String mStr;
	Function(String str){
		mStr = str;
		exe();
	}
	public void exe() {
		System.out.println(mStr);
	}
};
// Strategy Pattern
//射击接口
interface IShot{
	void exe();
}
// 跑接口
interface IRun{
	void exe();
}
//坦克
class Tank{
	IShot mShot;
	IRun mRun;
	public void exe() {
		mShot.exe();
		mRun.exe();
	}
}

//
interface IHandler{
	void create(Tank t);
}
//策略接口
interface IStrategy{
	//algorithm
	void create();
	void update(Tank t);
}

//--功能实现层--------------------------------------------------
//Concrete
//射击实现-50
class B50Shot implements IShot{
	public void exe() {
		Function f = new Function("发射距离50米");
	}
}
//射击实现-70
class B70Shot implements IShot{
	public void exe() {
		Function f = new Function("发射距离70米");
	}
}
//跑实现-50
class B50Run implements IRun{
	public void exe() {
		Function f = new Function("速度50公里");
	}
}
//跑实现-70
class B70Run implements IRun{
	public void exe() {
		Function f = new Function("速度70公里");
	}
}

//--观察者层------------------------------------------
class HandlerRunB70 implements IHandler{
	IStrategy mStrategy;
	public HandlerRunB70(IStrategy stragegy) {
		mStrategy = stragegy;
	}
	public void create(Tank t) {
		t.mRun = new B70Run();
		mStrategy.update(t);
	}
}
class HandlerSortB70 implements IHandler{
    //射击功能包含跑的功能
	HandlerRunB70 mNextHandler;
	public HandlerSortB70(HandlerRunB70 h){
		mNextHandler = h;
	}
	public void create(Tank t) {
		t.mShot = new B70Shot();
        //这里创建设计功能的时候,一定同时创建跑的功能
		mNextHandler.create(t);
	}
}

class HandlerRunB50 implements IHandler{
	IStrategy mStrategy;
	public HandlerRunB50(IStrategy stragegy) {
		mStrategy = stragegy;
	}
	public void create(Tank t) {
		t.mRun = new B70Run();
		mStrategy.update(t);
	}
}

class HandlerSortB50 implements IHandler{
    //射击功能包含跑的功能
	HandlerRunB50 mNextHandler;
	public HandlerSortB50(HandlerRunB50 h){
		mNextHandler = h;
	}
	public void create(Tank t) {
		t.mShot = new B70Shot();
        //这里创建设计功能的时候,一定同时创建跑的功能
		mNextHandler.create(t);
	}
}
//--策略层------------------------------------------
//--策略-b70
class B70Strategy implements IStrategy{
	HandlerSortB70 mStartChain;
	Client mClient;
	public B70Strategy(Client c) {
		HandlerRunB70 endChain  = new HandlerRunB70(this);
		mStartChain = new HandlerSortB70(endChain);
		mClient = c;
	}
	public void create() {
		Tank t = new Tank();
		mStartChain.create(t);
	} 
	public void update(Tank t) {
        //创建完成通知
		mClient.ceateTankFinish(t);
	}
}
//--策略-b50
class B50Strategy implements IStrategy{
	HandlerSortB50 mStartChain;
	Client mClient;
	public B50Strategy(Client c) {
		HandlerRunB50 endChain  = new HandlerRunB50(this);
		mStartChain = new HandlerSortB50(endChain);
		mClient = c;
	}
	public void create() {
		Tank t = new Tank();
		mStartChain.create(t);
	} 
	public void update(Tank t) {
		mClient.ceateTankFinish(t);
	}
}
//--客户端调用------------------------------------------------------------------
public class Client {
	public static void main(String[] args) {
		System.out.println("hello worldff !");
		Client c = new Client();
		IStrategy strategy = new B70Strategy(c);
		strategy.create();
	}
	public void ceateTankFinish(Tank t) {
		System.out.println("ceateTankFinish");
		t.exe();
	}
}

运行结果

后记:

其实细心的读者能发现,这里对坦克型号和机能的结合方式有点混乱,这里是明显需要用桥接的方式来处理的。

我稍后会在做些优化,这里主要体现“策略+职责链”的运用。

设计模式这东西,本质还是面向对象的特性。

无论用什么样的需求解释设计模式,最本质的东西和是面向对象的特性在模式里的体现。

标签:Tank,职责,void,模式,大战,class,new,create,public
From: https://blog.csdn.net/xie__jin__cheng/article/details/145251787

相关文章

  • SQL进阶实战技巧:用户会话内行为模式挖掘
    目录0问题描述 1数据准备2问题分析3小结 往期精彩0问题描述分析用户在每个会话内的行为序列,找出最常见的前N种行为模式,并按用户分群。用户表结构和数据假设有名为user_behavior_log的用户行为日志表,包含以下字段:字段名数据类型描述user_idINT用户IDbehav......
  • iStore网关(旁路由)模式设置教程
    OpenWrt网关(旁路由)模式设置教程本文是在帮助小白用户快速设置OpenWrt设备(如N1)为网关(旁路由)模式。通过以下步骤,你可以在三分钟内完成设置,让设备顺利上网。Step1:登录OpenWrt系统后台通过浏览器访问OpenWrt的管理界面,通常为192.168.1.1(如未更改过)。输入用户名......
  • Golang学习笔记_28——工厂方法模式
    Golang学习笔记_25——协程Golang学习笔记_26——通道Golang学习笔记_27——单例模式文章目录工厂方法模式1.介绍2.优点3.类图4.实现源码工厂方法模式1.介绍工厂方法模式(FactoryMethod)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实......
  • 咸鱼学妹大战数论
    有些比较浅显易懂的就偷懒没写了。数论-质数欧拉筛线性筛数论-因数倍数(upd:25/1/20)\(a,b\)最大公因数记为\(\gcd(a,b)\),无歧义时可记为\((a,b)\)。\(a,b\)最小公倍数记为\(\text{lcm}(a,b)\),无歧义时可记为\([a,b]\)。\(a\)是\(b\)的倍数\(=\)\(b\)是\(a\)的......
  • OpenWRT配置旁路由/中继模式,同时配置作为NAS必备的IPv6公网IP
    1.环境和要达成的目标1.1目标主路由已配置好拨号,DHCP,IPv6已刷OpenWRT路由B70作为中继路由,提高覆盖,解决一些老旧只能设备接入问题。OpenWRT路由同时插入移动硬盘,配置WebDAV和smba作为NAS使用,所以此路自身要能获取到IPv6地址。我的OpenWRT路由是极路由4,刷的是最新的OpenWRT24......
  • Spring框架中的设计智慧:揭秘那些经典设计模式
    Spring框架在开发过程中融入了多种设计模式,这些设计模式使得Spring更加灵活、易于扩展且功能强大。下面,我会尽量用通俗易懂的方式来解释Spring中用到的几种主要设计模式:1.单例模式(SingletonPattern):想象一下,你有一个特别昂贵的魔法宝石(Bean),这个宝石非常稀有且只能有一个。在......
  • 剧本杀系统开发,打破传统剧本杀模式
    近年来,剧本杀独特的游戏方式深受玩家的青睐,成为了桌游市场中最具发展潜力的游戏之一。剧本杀以角色扮演为主,让玩家在角色扮演中推理游戏,同时丰富玩家的社交需求。剧本杀市场的快速发展也衍生出了线上剧本杀,线上玩家体量大,能够为平台带来更多的用户;此外,商家也可以利用线上剧本......
  • STM32 中 GPIO 的八种工作模式介绍
    STM32的GPIO有八种工作模式,分为输入模式和输出模式,以下是详细介绍:输入模式1. 浮空输入(GPIO_Mode_IN_FLOATING)• 工作原理:引脚不连接内部上拉或下拉电阻,完全依赖外部电路来确定电平。引脚电平状态不确定,容易受外界干扰。• 适用场景:适用于连接高阻抗输出的外部设备,如......
  • PhotoShop-颜色模式
    1.位图模式点阵图像或栅格图像,是由称作像素的单个点构成的。2.位图只使用黑白两种颜色表示图像。3.去色图像->调整->阈值可以去色明度B在50%以上为白色。在50%以下为黑色。4.灰度模式使用黑白灰三种颜色表示图像5.图像-》调整去色和灰度模式效果相近。去色后可以添加......
  • C++,设计模式,【目录篇】
    文章目录1.简介2.设计模式的分类2.1创建型模式(CreationalPatterns):2.2结构型模式(StructuralPatterns):2.3行为型模式(BehavioralPatterns):3.使用设计模式的好处参考1.简介设计模式(DesignPatterns)是软件工程中针对常见问题的可重用解决方案。它们不是具体的......