黄药师及其五大弟子功夫继承关系篇----命令模式C++实现

学了C++基本的语法都知道继承可以让子类拥有更多的功能,除了继承还有组合,委托,也能让一个类的功能增加。设计模式,这个设计是设计继承,组合,委托,之间相互叠加的方式,让其符合业务需求。

命令模式是委托和继承的运用实例,它把一个类的函数转换成一个对象。通过多个类把一个类A作为它的委托,在各自类中调用这个类A的不同函数来实现。这样做看似有些多次一举,但如果碰到这样的需求,那这是很好的专家级的解决方案。如果我们的要调用的函数以千计,此设计模式可把这些函数转换为一个个对象,然后把这些对象放进容器里,这样我们可以像处理数据一样维护这些数据,把他们进行排序等操作。

设计模式对于刚刚学完C++语法的同学来说,还是比较难啃的一块,本系列通过<<神雕侠侣>>, <<射雕英雄传>>等武侠小说;<<龙珠>>,<<火影忍者>>动漫等方式,通过师徒,门派关系,功夫继承来阐明设计模式类之间关系,继承方式等。

上一篇:裘千尺裘千仞裘千丈与杨过篇–责任链模式C++实现
下一篇:孙猴子装饰七十二变篇–装饰器模式C++实现
这些代码都是在学习这些的过程中码的。。。。。

上代码,亲测有效!

Exe : Command.o
	g++ -o Exe Command.o
main.o : Command.cpp
	g++ -c -g Command.cpp
rm :
	Command
#include <iostream>
#include <string>
#include <queue>
using namespace std;


//命令模式

//黄药师
class Doctor_H
{
public:
    //半步<<九阴真经>> 含摧心掌,九阴白骨爪 梅超风,陈玄风
    void up_book();
    //劈空掌 曲灵风
    void break_from_air();
    //奇门遁甲 陆乘风
    void everything_from_nothing();
    //锻造 冯默风
    void smelt_from_iron();

    private:
    //碧海潮生曲
    void voice_from_sea();
    //弹指神通
    void power_from_finger();
};
    void Doctor_H::up_book()
    {
        cout << "摧心掌_九阴白骨爪" << endl;
    }
    void Doctor_H::break_from_air()
    {
        cout << "劈空掌" << endl;
    }
    void Doctor_H::everything_from_nothing()
    {
        cout << "奇门遁甲" << endl;
    }
    void Doctor_H::smelt_from_iron()
    {
        cout << "锻造" << endl;
    }




class Apprentice
{
public:
    virtual void show() = 0;
    Doctor_H* p_Doctor_H = NULL;
};


class Fe_Cu : public Apprentice
{
public:
    Fe_Cu(Doctor_H* p_Doctor_H);
    void show();
};
Fe_Cu::Fe_Cu(Doctor_H* p_Doctor_H)
{
    this->p_Doctor_H = p_Doctor_H;
}
void Fe_Cu::show()
{
    p_Doctor_H->up_book();
}

class QLF : public Apprentice
{
public:
    QLF(Doctor_H* p_Doctor_H);
    void show();
};
QLF::QLF(Doctor_H* p_Doctor_H)
{
    this->p_Doctor_H = p_Doctor_H;
}
void QLF::show()
{
    p_Doctor_H->break_from_air();
}

class LCF : public Apprentice
{
public:
    LCF(Doctor_H* p_Doctor_H);
    void show();
};
LCF::LCF(Doctor_H* p_Doctor_H)
{
    this->p_Doctor_H = p_Doctor_H;
}
void LCF::show()
{
    p_Doctor_H->everything_from_nothing();
}

class FMF : public Apprentice
{
public:
    FMF(Doctor_H* p_Doctor_H);
    void show();
};
FMF::FMF(Doctor_H* p_Doctor_H)
{
    this->p_Doctor_H = p_Doctor_H;
}
void FMF::show()
{
    p_Doctor_H->smelt_from_iron();
}

class World
{
public:
queue<Apprentice*> que_p_App;
void add_Apprentice(Apprentice* p_Apprentice);
void show();
};
void World::add_Apprentice(Apprentice* p_Apprentice)
{
    que_p_App.push(p_Apprentice);
}
void World::show()
{
    while(que_p_App.empty() != true)
    {
        que_p_App.front()->show(); //queue的front指最先插入的一个
        que_p_App.pop();
    }
    
}

int main(void)
{
    Doctor_H* p_Doctor_H = new Doctor_H;
    Fe_Cu* p_Fe_Cu = new Fe_Cu(p_Doctor_H);
    QLF* p_QLF = new QLF(p_Doctor_H);
    LCF* p_LCF = new LCF(p_Doctor_H);
    FMF* p_FMF = new FMF(p_Doctor_H);
    World* p_World = new World;

    p_World->add_Apprentice(p_Fe_Cu);
    p_World->add_Apprentice(p_QLF);
    p_World->add_Apprentice(p_LCF);
    p_World->add_Apprentice(p_FMF);

    p_World->show();


    return 0;
}

哎呦喂ヾ(✿゚▽゚)ノ~路长馆小,雪轻帘薄,酒热乎,这位爷~您ヾ(✿゚▽゚)ノ~ 里面坐~
本公众号专注分享C++,ffmpeg,opencv等相关音视频知识
webrtc,udp,tcp,rtsp,rtmp,srt/nginx+rtmp等流媒体协议和服务器
同时也会有大厂音视频技术专家不定期直播分享…
国人开发流媒体srs服务器,及yangrtc(国人版的webrtc)协议新动向
偶尔分享下程序员梦呓碎碎念(๑•॒̀ ູ॒•́๑)啦啦啦
目前刚刚开通,接受读者的优质投稿…
鉴于国内音视频圈子小,起步晚,以致分享少,门槛高,特开通分享,一起扇动这阵风吧!
微信扫描下方二维码,关注公众号,赶快进入音视频开发者社区吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是外观模式编程的实现: 首先,我们需要定义一个泡茶的外观类 TeaFacade,该类需要包含茶的五个步骤。其中,准备优质凉水和清洗茶具可以放在构造方法中执行,而选择茶叶和烧热水可以在泡茶方法中执行。TeaFacade 的泡茶方法可以接收一个参数,表示客人选择的茶叶种类。根据茶叶种类的不同,调用相应的泡茶方法进行泡茶。 接下来,我们需要定义四个具体的泡茶类,分别对应四种茶叶:ChrysanthemumTea、TieGuanYinTea、PuErTea 和 LongjingTea。这些类需要实现泡茶的方法,并且调用相关的步骤完成泡茶过程。 最后,我们需要定义三个客人类,分别对应欧阳锋、黄药师和洪七公。这些客人类需要调用 TeaFacade 的泡茶方法,并传入自己选择的茶叶种类。 请参考以下代码实现: ```java // 外观类,封装茶的五个步骤 public class TeaFacade { private Water water; private Tea tea; private Kettle kettle; private Teapot teapot; // 构造方法,准备优质凉水和清洗茶具 public TeaFacade() { water = new Water(); kettle = new Kettle(); teapot = new Teapot(); water.prepare(); kettle.boil(); teapot.clean(); } // 泡茶方法,根据茶叶种类选择不同的泡茶方法 public void makeTea(String teaType) { switch (teaType) { case "菊花": tea = new ChrysanthemumTea(); break; case "铁观音": tea = new TieGuanYinTea(); break; case "普洱": tea = new PuErTea(); break; case "西湖龙井": tea = new LongjingTea(); break; default: throw new IllegalArgumentException("无效的茶叶种类"); } tea.brew(teapot, water); System.out.println("泡好了一杯" + teaType + "茶"); } } // 泡茶接口,定义泡茶方法 public interface Tea { void brew(Teapot teapot, Water water); } // 菊花茶类,实现泡茶接口 public class ChrysanthemumTea implements Tea { @Override public void brew(Teapot teapot, Water water) { teapot.putTea(new Chrysanthemum()); teapot.putWater(water.getWater(100)); teapot.steep(3); } } // 铁观音茶类,实现泡茶接口 public class TieGuanYinTea implements Tea { @Override public void brew(Teapot teapot, Water water) { teapot.putTea(new TieGuanYin()); teapot.putWater(water.getWater(100)); teapot.steep(5); } } // 普洱茶类,实现泡茶接口 public class PuErTea implements Tea { @Override public void brew(Teapot teapot, Water water) { teapot.putTea(new PuEr()); teapot.putWater(water.getWater(100)); teapot.steep(7); } } // 龙井茶类,实现泡茶接口 public class LongjingTea implements Tea { @Override public void brew(Teapot teapot, Water water) { teapot.putTea(new Longjing()); teapot.putWater(water.getWater(100)); teapot.steep(2); } } // 水类,提供 prepare 方法获取优质凉水 public class Water { public void prepare() { System.out.println("准备优质凉水"); } public Water getWater(int ml) { System.out.println("取出" + ml + "ml水"); return this; } } // 热水壶类,提供 boil 方法烧开水 public class Kettle { public void boil() { System.out.println("烧热水"); } } // 茶壶类,提供 clean 方法清洗茶具,putTea 方法放入茶叶,putWater 方法放入水,steep 方法冲泡 public class Teapot { public void clean() { System.out.println("清洗茶具"); } public void putTea(TeaLeaf teaLeaf) { System.out.println("放入" + teaLeaf.getName() + "茶叶"); } public void putWater(Water water) { System.out.println("放入水"); } public void steep(int seconds) { System.out.println("冲泡" + seconds + "秒"); } } // 茶叶接口,定义 getName 方法获取茶叶名称 public interface TeaLeaf { String getName(); } // 菊花类,实现茶叶接口 public class Chrysanthemum implements TeaLeaf { @Override public String getName() { return "菊花"; } } // 铁观音类,实现茶叶接口 public class TieGuanYin implements TeaLeaf { @Override public String getName() { return "铁观音"; } } // 普洱类,实现茶叶接口 public class PuEr implements TeaLeaf { @Override public String getName() { return "普洱"; } } // 龙井类,实现茶叶接口 public class Longjing implements TeaLeaf { @Override public String getName() { return "西湖龙井"; } } // 客人类,调用 TeaFacade 的泡茶方法 public class Customer { private TeaFacade teaFacade; public Customer(TeaFacade teaFacade) { this.teaFacade = teaFacade; } public void drink(String teaType) { teaFacade.makeTea(teaType); } } // 测试类 public class Test { public static void main(String[] args) { TeaFacade teaFacade = new TeaFacade(); Customer ouyangfeng = new Customer(teaFacade); ouyangfeng.drink("菊花"); Customer huangyaoshi = new Customer(teaFacade); huangyaoshi.drink("铁观音"); Customer hongqiugong = new Customer(teaFacade); hongqiugong.drink("西湖龙井"); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、、、、南山小雨、、、、

分享对你有帮助,打赏一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值