享元模式
flyweight pattern 实例的属性可分为两种: 内在状态intrinsic state:可以被共享的状态 外在状态extrinsic state:不可被共享的状态,经常被外部实例更改 享元模式的本质是,抽取公共属性作为单独的类,以静态形式存储。每个实例都拥有这个公共属性的指针。也即“共享”一部分“元数据”。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647class TreeType { std::string name_; std::string color_; std::string texture_; public: TreeType(std::string name, std::string color, Texture texture): name_(name), color_(color), texture_(texture) {} void draw(const Canvas&...
外观模式
外观/门面facade模式可以将应用与一个复杂的第三方库简单地连接起来,尤其是应用只依赖于复杂第三方库的一小部分功能的时候。它有四个部分 Facade Additional Facade: 继承Facade并为Facade添加一些其他功能,而不改变Facade这一简单接口本身 The Complex system client 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455// a complex 3rd party video conversion frameworkclass VideoFile { // ...}class OggCompressionCodec { // ...}class MPEG4CompressionCodec { // ...}class CodecFactory { // ...}class Bitra...
桥梁模式
将“抽象化Abstraction”与“实现化Implementation”解耦。抽象的本意是将强耦合(继承)转换为弱耦合(聚合)。这里的抽象与实现不是一般程序设计下的抽象与实现 抽象:主要指高层的控制层,定义了基于“实现”的操作,如“遥控器”操作“电视机”。但是遥控器只负责发射指令,不关心指令的具体实现。 实现:抽象行为的具体执行者,比如“电视机”接受“遥控器”发出的关机指令。电视机接收指令,并负责关闭自己。 如此一来,抽象与实现就可以解耦,分别维护。 个人感觉最直观的还是类多维度解耦最直观:比如设备有电视、收音机;遥控器有基本遥控器、高级遥控器。如果用vanilla OOP的角度,需要设计4个类:电视基本遥控器、电视高级遥控器……但是使用桥接模式可以把实现(机器)绑定(聚合)给抽象(遥控器)。机器、遥控器实现相同的接口即可。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666...
代理模式
代理模式感觉也是套一层壳。 适配器模式主要关注于解决接口的不兼容性问题,而代理模式主要关注于控制对其它对象的访问 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768class ThirdPartyYouTubeLib { public: virtual std::vector<Video> listVideos() const = 0; virtual Video getVideoInfo(int videoId) const = 0; virtual void downloadVideo(int videoId) const = 0;}class ThirdPartyYouTubeClass: public ThirdPartyYouTubeLib { public: std::vector<Vid...
装饰器模式
经典装饰器模式,装饰器本身是一种聚合aggregation。装饰器类和被装饰对象应该有共同接口(比如read和write)。在实现这些接口的时候,应该调用被装饰对象的方法。 方法可以被装饰(Python常见),同时类也可以被装饰! 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576class DataSource { public: virtual ~DataSource() {} virtual void writeData(std::string& data) const = 0; virtual std::string readData() const = 0;};class FileDataSource: public DataSource { public: ...
组合模式
组合模式是一种树形结构,有两种重要节点:叶节点和组合节点。组合节点可以包含叶节点或子组合节点。但是无论叶节点还是组合节点,都有相同的接口,只不过叶节点执行具体的操作,而组合节点执行遍历,并将操作传递给子节点。 组合模式的树形结构有一些独特的优势,例如,你可以任意选择若干个子树,然后重新组合,成为一个新的树而不干扰现有的结构! 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869class Graphic { public: virtual void move(int x, int y) = 0; virtual void draw(Canvas& c) const = 0; virtual ~Graphic() {};};class Dot: public Graphic { public: ...
脑区解剖分割笔记
background 第三脑室3rd-Ventricle 第四脑室4th-Ventricle 伏隔核✅Right-Accumbens-Area:在大脑的快乐中枢对诸如食物、性、毒品等刺激有反应 Left-Accumbens-Area 杏仁核Right-Amygdala Left-Amygdala Brain-Stem 尾状核✅Right-Caudate Left-Caudate Right-Cerebellum-Exterior Left-Cerebellum-Exterior Right-Cerebellum-White-Matter Left-Cerebellum-White-Matter Right-Cerebral-White-Matter Left-Cerebral-White-Matter Right-Hippocampus Left-Hippocampus Right-Inf-Lat-Vent Left-Inf-Lat-Vent Right-Lateral-Ventricle Left-Lateral-Ventricle 苍白球Right-Pallidum Lef...
建造者模式
构造函数可能非常复杂,例如:一个蛋糕,可能有各种形状、口味、尺寸、奶油、水果……构造函数需要接收大量参数,执行复杂的初始化过程(例如,需要大量条件判断这些参数是否为空)。为了解决这个问题,引入建造者模式,简化构造函数。 建造者模式需要三个关键组件 目标类:比如class Car 建造者:比如class CarBuilder,包含了构造车的各种方法 监督者 构造者模式用于建造非常复杂的对象,因此,这个目标对象可能不遵循相同的接口 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879class Car { public: std::vector<std::string> parts_; // 下划线用于区分成员变量和参数/局部变量 // std::unordered_map<std::stri...
MONAI label学习笔记
图片配准 模板记得选nii格式的。下面的代码可以帮助配准PET/MR图像,PET图像使用MR图像的相同变换模式。 1234567891011import antsmr_image = ants.image_read('./abeta/mr.nrrd')mni_template = ants.image_read('./mni305_lin_nifti/average305_t1_tal_lin.nii')mr_to_mni_transform = ants.registration(fixed=mni_template, moving=mr_image, type_of_transform='Affine')pet_image = ants.image_read('./abeta/pet.nrrd')pet_to_mni = ants.apply_transforms(fixed=mni_template, moving=pet_image, transformlist=mr_to_mni_tra...
原型模式
可以帮助拷贝已存在的实例而使代码不依赖于类的定义。 本质上就是为了提供一个.copy/.deepcopy方法。如果没有这一方法,就需要创建一个新的空对象,然后遍历旧实例的所有属性。 Python中使用copy.copy (self.__copy__)和copy.deepcopy (self.__deepcopy__)实现原型模式。注意:__deepcopy__(self, memo=None)的memo参数用于防止递归拷贝。 1234567891011classDiagramclass Animal {4 +mammalChild: Mammal}class Mammal { +animalParent: Animal}Animal --o MammalMammal --o Animal 上面的例子是一个存在递归拷贝的问题:拷贝animal会拷贝mammalChild,拷贝mammalChild时又需要拷贝animalParent。 1234567891011121314151617181920212223242526272...






